在画布上运行多线程的android应用程序在显示广告后崩溃
我的android应用程序显示一个画布,上面有多个精灵,精灵有自己的线程,底部显示一个横幅广告,当点击广告时显示完整广告,点击返回按钮返回应用程序崩溃应用程序,找不到日志猫 下面是创建gameLoopthread的gameView类代码在画布上运行多线程的android应用程序在显示广告后崩溃,android,multithreading,admob,android-canvas,Android,Multithreading,Admob,Android Canvas,我的android应用程序显示一个画布,上面有多个精灵,精灵有自己的线程,底部显示一个横幅广告,当点击广告时显示完整广告,点击返回按钮返回应用程序崩溃应用程序,找不到日志猫 下面是创建gameLoopthread的gameView类代码 public GameView(Context context) { super(context); tmpcontext = context; gameLoopThread = new GameLoopTh
public GameView(Context context) {
super(context);
tmpcontext = context;
gameLoopThread = new GameLoopThread(this);
bmpback = BitmapFactory.decodeResource(getResources(), R.drawable.e_castle_1);
getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
createSprites();
gameLoopThread.setRunning(true);
if(gameviewcreated == false) gameLoopThread.start();
if(gameviewcreated == true)
try {
gameLoopThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
gameviewcreated = true;
}
最初,我在surfaceCreated方法中只有gameLoopThread.start(),所以当用户单击它时,它在显示广告后试图再次启动该线程,因此发生爆炸,现在我添加了检查以查看是否已创建gameviewcreated。它不会崩溃,但不会带来原始线程,因此不会显示画布或精灵,因为join应该这样做。您似乎对Java中应该如何使用线程感到困惑 Join将阻塞,直到螺纹消失
很难对您的代码进行评论,因为它不清楚GameView是何时或如何构建的,也不清楚您对GameLoopThread的了解。我怀疑您想从GameView而不是从SurfaceHold回调控制线程生命周期。我还建议您使用一个纯线程对象,并向它传递一个执行逻辑的Runnable。两者的分离将为您的编码风格带来奇迹。必须有一些日志。你需要发布你所拥有的。添加的代码,请查看。同意你的意见,使用线程的新手。我在没有加入的情况下尝试了该代码,但它不起作用。我的屏幕在画布上显示精灵,用户单击横幅广告,当他单击后退时,程序应自动恢复,并由系统处理,我不必做任何事情。