【问题标题】:weird Logcat output when dismissing custom keyboard关闭自定义键盘时出现奇怪的 Logcat 输出
【发布时间】:2012-01-23 20:13:25
【问题描述】:

我有一个自定义键盘应用程序,当我按下返回按钮退出它时,大约有 1/4 的时间会得到这个 LogCat 输出:

12-19 13:18:13.908: W/InputMethodManager(361): IME died: com.mypackage/.MyActivity dropping: KeyEvent{action=1 code=4 repeat=0 meta=0 scancode=158 mFlags=72}
12-19 13:18:13.908: W/InputMethodManager(361): android.os.DeadObjectException
12-19 13:18:13.908: W/InputMethodManager(361):  at android.os.BinderProxy.transact(Native Method)
12-19 13:18:13.908: W/InputMethodManager(361):  at com.android.internal.view.IInputMethodSession$Stub$Proxy.dispatchKeyEvent(IInputMethodSession.java:277)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.view.inputmethod.InputMethodManager.dispatchKeyEvent(InputMethodManager.java:1344)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.view.ViewRoot.deliverKeyEvent(ViewRoot.java:2426)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1741)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.os.Looper.loop(Looper.java:123)
12-19 13:18:13.908: W/InputMethodManager(361):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-19 13:18:13.908: W/InputMethodManager(361):  at java.lang.reflect.Method.invokeNative(Native Method)
12-19 13:18:13.908: W/InputMethodManager(361):  at java.lang.reflect.Method.invoke(Method.java:521)
12-19 13:18:13.908: W/InputMethodManager(361):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-19 13:18:13.908: W/InputMethodManager(361):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-19 13:18:13.908: W/InputMethodManager(361):  at dalvik.system.NativeStart.main(Native Method)

有人遇到过这种情况吗?

这是我覆盖后退按钮时的代码

if(mInputView.getVisibility() == View.VISIBLE){

    if(isInputViewShown()){
        if(output != null){
             if(getCurrentInputConnection() != null){
                       getCurrentInputConnection().deleteSurroundingText(1000, 1000);
                       getCurrentInputConnection().commitText(output.getText(), output.length());
             }
        output.setText("");
    }

    requestHideSelf(0);
    return true;
}else return false;

【问题讨论】:

  • 这是在手机上还是模拟器上?
  • 它来自我正在调试的手机

标签: android android-input-method


【解决方案1】:

谷歌搜索“android.os.DeadobjectException IME”会得到:http://osdir.com/ml/Android-Developers/2010-10/msg04248.html

似乎在 IME 被杀死之前 UI 没有机会处理所有关键事件时引发了异常。这将解释第一行:

12-19 13:18:13.908: W/InputMethodManager(361): IME died: com.mypackage/.MyActivity dropping: KeyEvent{action=1 code=4 repeat=0 meta=0 scancode=158 mFlags=72}

这个消息没什么大不了的,它是在处理所有关键事件之前杀死 IME 的结果。

【讨论】:

    【解决方案2】:

    看起来您在取消键盘和调度通过按下后退按钮生成的 keyevent 之间遇到了竞争条件。 DeadObjectException 表示虽然对象(此处为 KeyEvent)仍在使用中,但它的宿主进程(IME)已经死亡。这会使对象无效并引发异常。

    您可以在KeyEvent 参数中看到这一点。键码是4,也就是KeyEvent.KEYCODE_BACK的值。

    不同的手机在这里的行为方式可能不同(this 未回答的问题类似)。我猜这个异常可以忽略。

    【讨论】:

    • 你知道我该如何解决这个问题吗?
    • 我不确定。我以前没有使用过软键盘。 requestHideSelf() 应该让进程继续运行,这样就不会发生这种情况,这就是为什么我认为这可能是特定于电话/实现的。如果它不会使您的程序崩溃,我会忽略它。如果是这样,那么也许您可以捕获异常。
    • 或者您也可以尝试始终返回 true,即使输入视图不可见。也许然后该事件将被视为已处理并且以后不会使用。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2013-12-21
    • 2014-02-04
    相关资源
    最近更新 更多