18

这是我收到的警告:

03-02 14:38:43.980: W/InputEventReceiver(3961): Attempted to finish an input event but the input event receiver has already been disposed.

我的菜单是从常规res/menu/activity_menu.xml文件生成的。我正在按照http://developer.android.com/guide/topics/ui/menus.html#options-menu上的详细信息处理事件

当我单击垂直的三个点以打开溢出菜单并取消它时,我收到了警告。似乎对如何抓住它的触发器知之甚少。有任何想法吗?

4

1 回答 1

14

这与你的工作无关。

溢出菜单由 PopupWindow 实现。当用户触摸关闭 PopupWindow 时,ACTION_DOWN 事件排队到应用程序的消息队列中。然后通过 ViewPostImeInputStage 类传递给 View,最后 ViewPostImeInputStage 将此输入事件发送到 PopupWindow 的 onTouchEvent 监听器。

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int x = (int) event.getX();
        final int y = (int) event.getY();

        if ((event.getAction() == MotionEvent.ACTION_DOWN)
                && ((x < 0) || (x >= getWidth()) || (y < 0) || (y >= getHeight()))) {
            dismiss();
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
            dismiss();
            return true;
        } else {
            return super.onTouchEvent(event);
        }
    }

dissmiss() 尝试先关闭 PopupWindow 和 PopupWindow::onDetachedWindow 调用 WindowInputEventReceiver::dispose() 。

然后 ViewPostImeInputStage 调用 WindowInputEventReceiver::finishInputEvent 来完成那个 ACTION_DOWN 事件。但是 WindowInputEventReceiver 实例已被释放,因此它会引发警告消息。

可以断点调试。打开InputEventReceiver.java(需要android源码在framework/base/)并在dispose方法处设置断点。

于 2014-01-09T06:03:46.697 回答