一、错误信息
02-12 19:49:22.167 30890-30890/com.luminal.imageview.draw.myapplication E/InputEventReceiver: Exception dispatching input event.
02-12 19:49:22.167 30890-30890/com.luminal.imageview.draw.myapplication E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
02-12 19:49:22.167 30890-30890/com.luminal.imageview.draw.myapplication E/MessageQueue-JNI: java.lang.NullPointerException
at com.luminal.imageview.draw.myapplication.MySurfaceView.onTouchEvent(MySurfaceView.java:83)
at android.view.View.dispatchTouchEvent(View.java:7706)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
at android.view.View.dispatchPointerEvent(View.java:7886)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3978)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3857)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3549)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3606)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3473)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3442)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3450)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3423)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5626)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5606)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5577)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5706)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
二、解决方式
1、根据错误信息,空指针异常,我们知道某个对象为空
2、根据错误第83行,我们知道定位错误出现在哪一行。我们可以输出对象查看
如:我自定义的SurfaceView类MySurfaceView,里面自定义了绘制线程DrawingThread,打印输出后drawingThread对象为null
//7、添加触摸事件,创建DrawingItem对象
@Override
public boolean onTouchEvent(MotionEvent event) {
//监听down事件
if(event.getAction() == MotionEvent.ACTION_DOWN){
Log.v("SurfaceView@@@","点击屏幕后:"+drawingThread);
//添加图片对象
drawingThread.addItem(event.getX(),event.getY());
}
return super.onTouchEvent(event);
}
而DrawingThread对象是在,surfaceCreated方法里面调用的
@Override
public void surfaceCreated(SurfaceHolder holder) {
//创建
//6、通过SurfaceView的生命周期来执行我们的线程,绘制我们的图片
//此图片为资源文件里面的默认图片
drawingThread = new DrawingThread(getHolder(),
BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
drawingThread.start();
}
那么什么时候调用surfaceCreated方法呢?
1、MySurfaceView类实现接口SurfaceHolder.Callback,重写回调方法surfaceCreated
2、添加对接口SurfaceHolder.Callback的监听
就是在MySurfaceView构造方法里面,没有调用initParams方法,没有实现接口的监听,才会报错。
public MySurfaceView(Context context) {
super(context);
initParams();
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initParams();
}
//2、监听SurfaceView的生命周期
private void initParams(){
getHolder().addCallback(this);
}