Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:应用程序在按下后崩溃-SurfaceView_Java_Android_Android Activity_Android Canvas_Surfaceview - Fatal编程技术网

Java Android:应用程序在按下后崩溃-SurfaceView

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

我正在开发一个android应用程序,刚刚创建了背景画布。应用程序加载正常,但当我按下后退按钮即关闭应用程序时,应用程序崩溃。查看下面的logcat,我得到一个NullPointerException。有人知道我能解决这个问题吗

以下是我的课程:

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中可以找到示例,例如活动