关于TouchEvent中MessageQueue-JNI问题

E/InputEventReceiver(9016): Exception dispatching input event.
E/MessageQueue-JNI(9016): Exception in MessageQueue callback: handleReceiveCallback
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.TimePicker.updateInputState(TimePicker.java:709)
at android.widget.TimePicker.access 500(TimePicker.java:75)atandroid.widget.TimePicker 6.onTouch(TimePicker.java:279)
at android.view.View.dispatchTouchEvent(View.java:7456)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2270)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1967)
at android.widget.NumberPicker.dispatchTouchEvent(NumberPicker.java:992)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:125)
at android.os.Looper.loop(Looper.java:124)

愚见:多次触发触摸屏事件,导致对同一个事件处理的消息过多,当第一个消息已处理完事件并销毁事件时,由于该事件已销毁但还没来得及通知销毁第二个同样的消息,当主线程执行第二个消息时,由于获取不了该事件,所以抛出异常。

解决:用try..catch..包围TouchEvent事件处理。

比如在某个activity中监听触摸来隐藏软键盘事件:

 private boolean isShouldHideKeyboard(View v, MotionEvent event) {
        try {
            v.getParent().requestDisallowInterceptTouchEvent(true);//通知父控件勿拦截本控件touch事件  
            if (v != null && (v instanceof EditText)) {
                int[] l = {0, 0};
                v.getLocationInWindow(l);
                int left = l[0],
                    top = l[1],
                    bottom = top + v.getHeight(),
                    right = left + v.getWidth();
                if (event.getX() > left && event.getX() < right
                        && event.getY() > top && event.getY() < bottom) {
                    // 点击EditText的事件,忽略它。
                    return false;
                } else {
                    return true;
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            return false;
        }

        // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
        return false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值