解除自定义键盘时奇怪的Logcat输出

时间:2011-12-19 18:30:10

标签: android android-input-method

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

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;

2 个答案:

答案 0 :(得分:2)

谷歌搜索“android.os.DeadobjectException IME”会产生这样的结果:http://osdir.com/ml/Android-Developers/2010-10/msg04248.html

当用户界面在IME被杀死之前没有机会处理所有关键事件时,似乎抛出异常。这可以解释第一行:

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的结果。

答案 1 :(得分:1)

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

您可以在KeyEvent参数中看到这一点。密钥代码为4,即KeyEvent.KEYCODE_BACK的值。

不同的手机在这里可能表现出不同的方式(this未答复的问题类似)。我猜这个例外可以被忽略。