Android canvas.drawBitmap()在设备上崩溃

Android canvas.drawBitmap()在设备上崩溃,android,game-engine,Android,Game Engine,我是android游戏开发新手。在模拟器和我的一个安卓设备上一切正常,但在我的Nexus4上崩溃了 我正在尝试使用 @Override public boolean dispatchTouchEvent(MotionEvent event) { if(!jump){ first=true; makeajump(); } return super.dispatchTouchEvent(event); } 这就是nexus上调试模式测试中出现错误的原因:

我是android游戏开发新手。在模拟器和我的一个安卓设备上一切正常,但在我的Nexus4上崩溃了

我正在尝试使用

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    if(!jump){
    first=true;
    makeajump();
    }

    return super.dispatchTouchEvent(event);
}
这就是nexus上调试模式测试中出现错误的原因:

jcanvas.drawBitmap(mytree, xtree1,height-t1.getHeight(), null);//inside makeajump() line 404
在用户点击屏幕之前,一切都正常

jcanvas = canvas;//set in onDraw(),jcanvas is global
这是错误发生时的日志:

06-18 18:40:55.752: E/InputEventReceiver(8523): Exception dispatching input event.
06-18 18:40:55.752: E/MessageQueue-JNI(8523): Exception in MessageQueue callback: handleReceiveCallback
06-18 18:40:55.762: E/MessageQueue-JNI(8523): java.lang.NullPointerException
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:105)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at lion.run.vjapps.game.animal.GameView.makeajump(GameView.java:404)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at lion.run.vjapps.game.animal.GameView.dispatchTouchEvent(GameView.java:455)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.View.dispatchPointerEvent(View.java:7426)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.os.MessageQueue.nativePollOnce(Native Method)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.os.MessageQueue.next(MessageQueue.java:125)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.os.Looper.loop(Looper.java:124)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at android.app.ActivityThread.main(ActivityThread.java:5041)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at java.lang.reflect.Method.invokeNative(Native Method)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at java.lang.reflect.Method.invoke(Method.java:511)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-18 18:40:55.762: E/MessageQueue-JNI(8523):   at dalvik.system.NativeStart.main(Native Method)
06-18 18:40:55.762: D/AndroidRuntime(8523): Shutting down VM
06-18 18:40:55.762: W/dalvikvm(8523): threadid=1: thread exiting with uncaught exception (group=0x41a8d930)
06-18 18:40:55.762: E/AndroidRuntime(8523): FATAL EXCEPTION: main
06-18 18:40:55.762: E/AndroidRuntime(8523): java.lang.NullPointerException
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:105)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at lion.run.vjapps.game.animal.GameView.makeajump(GameView.java:404)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at lion.run.vjapps.game.animal.GameView.dispatchTouchEvent(GameView.java:455)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1875)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.app.Activity.dispatchTouchEvent(Activity.java:2410)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.View.dispatchPointerEvent(View.java:7426)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.os.MessageQueue.nativePollOnce(Native Method)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.os.MessageQueue.next(MessageQueue.java:125)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.os.Looper.loop(Looper.java:124)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at android.app.ActivityThread.main(ActivityThread.java:5041)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at java.lang.reflect.Method.invokeNative(Native Method)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at java.lang.reflect.Method.invoke(Method.java:511)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-18 18:40:55.762: E/AndroidRuntime(8523):     at dalvik.system.NativeStart.main(Native Method)

非常感谢您的帮助……非常感谢。

您应该将绘图代码移到onDraw()中

您可以在onDraw()之外进行计算,并调用
invalidate()
刷新绘图

public void invalidate ()

使整个观点无效。如果视图可见,将来某个时候将调用onDraw(android.graphics.Canvas)。这必须从UI线程调用。要从非UI线程调用,请调用postInvalidate()。

在onDraw()中绘制的位置?drawBitmap(mytree,xtree1,height-t1.getHeight(),null);否,jcanvas.drawBitmap(mytree,xtree1,height-t1.getHeight(),null);方法在onDraw()之外。您必须使用画布对象在onDraw()中绘制它。您可以调用invalidate来刷新分配给jcanvas=canvas的绘图;在onDraw内部,jcanvas是全球性的。。让我想想,我会试试的…嘿,它现在起作用了。。。我把所有的drawBitmap都改成了inside onDraw,所有的东西都可以在手机上使用…谢谢,我想知道为什么它可以在emulator上使用,而在nexus上却不能使用。。。
public void invalidate ()