QT for Android 开发的应用,在使用输入法输入后,应用程序切换后台,再次切换回来后卡死,提示没有响应是否等待。QT版本5.12,Android系统抓取的ANR日志如下,求解决方案。
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x72498338 self=0xb400007f3042dc00
| sysTid=26093 nice=-10 cgrp=default sched=0/0 handle=0x7f31b7e4f8
| state=S schedstat=( 1318444513 61412081 489 ) utm=99 stm=32 core=1 HZ=100
| stack=0x7fe6e7f000-0x7fe6e81000 stackSize=8192KB
| held mutexes=
native: #00 pc 0000000000086b4c /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
native: #01 pc 00000000000b90cc /data/app/~~nk-CyG2Gd70sx6nnPgXRCA==/org.qtproject.example.AndroidTest-DYgotXpRFd2InYwFBWyYFg==/lib/arm64/libQt5Core.so (QSemaphore::acquire(int)+296)
at org.qtproject.qt5.android.QtNativeInputConnection.finishComposingText(Native method)
at org.qtproject.qt5.android.QtInputConnection.finishComposingText(QtInputConnection.java:171)
at android.view.inputmethod.BaseInputConnection.closeConnection(BaseInputConnection.java:161)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:540)
at com.android.internal.view.IInputConnectionWrapper.dispatchMessage(IInputConnectionWrapper.java:232)
at com.android.internal.view.IInputConnectionWrapper.closeConnection(IInputConnectionWrapper.java:215)
at android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper.deactivate(InputMethodManager.java:1016)
at android.view.inputmethod.InputMethodManager.clearConnectionLocked(InputMethodManager.java:1511)
at android.view.inputmethod.InputMethodManager.clearBindingLocked(InputMethodManager.java:1483)
at android.view.inputmethod.InputMethodManager$H.handleMessage(InputMethodManager.java:854)
- locked <0x0d26dd5c> (a android.view.inputmethod.InputMethodManager$H)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:236)
at android.app.ActivityThread.main(ActivityThread.java:7876)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
QT的信号量机制大概是导致应用卡死的原因,要注意在输入法的操作中。尝试升级QT版本解决
尝试解决方案
void changeEvent(QEvent * event)
{
if(event->type() == QEvent::WindowStateChange)
{
if(!isMinimized())
{
setAttribute(Qt::WA_Mapped);
}
}
QWidget::changeEvent(event);
}
Qt中采用的是Qml框架,只要不用输入法输入,切换后台后都能正常切换回来,一旦调用输入法后,后台切换回来就会卡死。
望采纳!!!
打开 android 目录,找到 androidManifest.xml,找到你的 activity,配置如下属性,键盘不自动弹出来
android:windowSoftInputMode="stateAlwaysHidden"
避免从后台切回来键盘自己弹出来的问题。
在测试环境重现,查堆栈调用关系,找到输入法句柄,再看冲突原因。
这个问题可能是由于Qt应用与Android输入法之间的通信出现了问题导致的。可以考虑更新Qt版本,或者联系Qt官方技术支持,以获得更详细的解决方案。
注意输入法
可以尝试下使用生命周期进行解决,判断一下activity生命周期的,比如后台切回来的时候执行键盘关闭的操作。
不知道你这个问题是否已经解决, 如果还没有解决的话:
at org.qtproject.qt5.android.QtNativeInputConnection.finishComposingText(Native method)
从错误日志看,是切换到后台时,未释放QT输入法相关控件,导致底层存在锁,再次切回来时QT内部有异常,所以解决方案应该是,切换到后台时,网上搜一下,QT如何关闭输入法的资源