Java Android:应用程序在按下后崩溃-SurfaceView
我正在开发一个android应用程序,刚刚创建了背景画布。应用程序加载正常,但当我按下后退按钮即关闭应用程序时,应用程序崩溃。查看下面的logcat,我得到一个NullPointerException。有人知道我能解决这个问题吗 以下是我的课程:Java Android:应用程序在按下后崩溃-SurfaceView,java,android,android-activity,android-canvas,surfaceview,Java,Android,Android Activity,Android Canvas,Surfaceview,我正在开发一个android应用程序,刚刚创建了背景画布。应用程序加载正常,但当我按下后退按钮即关闭应用程序时,应用程序崩溃。查看下面的logcat,我得到一个NullPointerException。有人知道我能解决这个问题吗 以下是我的课程: package pmm.antiaircraft1; import android.app.Activity; import android.view.Window; import android.view.WindowManager; publi
package pmm.antiaircraft1;
import android.app.Activity;
import android.view.Window;
import android.view.WindowManager;
public class GameActivity extends Activity {
private GameThread mGameThread;
public void onStart() {
super.onStart();
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
mGameThread = ((GameView) findViewById(R.id.game)).getThread();
mGameThread.createGraphics();
}
}
包pmm.AntiAircrafter1;
导入android.content.Context;
导入android.content.res.Resources;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.os.Handler;
导入android.util.DisplayMetrics;
导入android.view.SurfaceHolder;
公共类GameThread扩展线程{
私人地表持有人;
public DisplayMetrics=新的DisplayMetrics;
私有静态位图;
公共静态位图;
公共静态位图扫描;
公共静态布尔值mRun=false;
私家坦克;
公共静态资源;
公共游戏ThreadSurfaceHolder surfaceHolder,上下文上下文,处理程序{
mSurfaceHolder=表面支架;
Resources res=context.getResources;
mBackgroundImage=BitmapFactory.decodeResourceres,R.drawable.background;
tankImg=位图工厂.decodeSourceRes,R.drawable.tank;
cannonImg=BitmapFactory.decodeSourceRes,R.drawable.cannon;
}
@
推翻
公开募捐{
而mRun{
c=null;
试一试{
c=mSurfaceHolder.lockCanvasnull;
同步化表面处理器{
drawc;
}
}最后{
如果c!=null{
mSurfaceHolder.unlockcanvasandpost;
}
}
}
}
公共无效设置运行布尔值b{
mRun=b;
}
私有虚空画布{
canvas.drawBitmapmBackgroundImage,0,0,null;
坦克.帆布;
}
公共图形{
mBackgroundImage=Bitmap.createBitmapmBackgroundImage;
储罐=新储罐;
}
}
包pmm.5防空飞机;
导入android.content.Context;
导入android.util.AttributeSet;
导入android.view.SurfaceHolder;
导入android.view.SurfaceView;
公共类GameView扩展了SurfaceView实现了SurfaceHolder.Callback{
私有游戏线程;
公共游戏视图上下文,属性集属性{
超级上下文;
SurfaceHolder holder=getHolder;
holder.addCallbackthis;
线程=新游戏线程持有者,上下文,空;
}
公共游戏线程getThread{
返回线程;
}
公共空隙表面创建的表面支架{
thread.setRunningtrue;
thread.start;
}
@
推翻
public void surfaceChangedSurfaceHolder支架,int格式,int宽度,
整数高度{}
@
推翻
公共空隙表面支撑物表面支撑物{
此.setWillNotDrawfalse;
}
}
包pmm.AntiAircrafter1;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Matrix;
公营坦克{
专用静态最终内部储罐高度=50;
专用静态最终整流罩宽度=50;
专用静态最终内部储罐顶部=480-储罐高度;
专用静态最终int加农炮_宽度=10;
公用坦克{
GameThread.tankImg=Bitmap.createBitmapGameThread.tankImg;
GameThread.cannonImg=Bitmap.createBitmapGameThread.cannonImg;
}
公共图书馆{
c、 drawBitmapGameThread.tankImg,320-TANK_宽度/2,TANK_顶部,空;
矩阵m=新矩阵;
m、 翻译后320-加农炮宽度/2,坦克顶部-30;
c、 drawBitmapGameThread.cannonImg,m,null;
}
}
日志输出:
W/SurfaceView400:检查曲面信息创建=假格式更改=假大小更改=假可见=假可见更改=真表面更改=真真实大小更改=假重画所需=假左=假顶=假
**E/AndroidRuntime400:致命异常:线程-88523
E/AndroidRuntime400:java.lang.NullPointerException
E/AndroidRuntime400:at pmm.antiaircraft1.GameThread.drawGameThread.java:52
E/AndroidRuntime400:at pmm.antiaircraft1.GameThread.runGameThread.java:37**
W/SurfaceView400:检查曲面信息创建=假格式更改=假大小更改=假可见=假可见更改=假表面更改=假真实大小更改=假重画所需=假左=假顶=假
03-29 01:56:46.565:W/SurfaceView400:检查曲面信息创建=假格式更改=假大小更改=假可见=假可见更改=假表面更改=假真实大小更改=假重画所需=假左=假顶=假
SurfaceView生命周期与活动生命周期不完全相同。如果您在运行中检查lockCanvas的结果,并且当它为空时不尝试绘制,那么您应该能够避免崩溃,而不会出现任何可见的故障 要更仔细地执行此操作并避免其他潜在问题,需要使用表面回调来跟踪当前状态。可以在图形体系结构文档中找到解释,在Grafika中可以找到示例,例如活动