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;
}