在画布上运行多线程的android应用程序在显示广告后崩溃

在画布上运行多线程的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

我的android应用程序显示一个画布,上面有多个精灵,精灵有自己的线程,底部显示一个横幅广告,当点击广告时显示完整广告,点击返回按钮返回应用程序崩溃应用程序,找不到日志猫

下面是创建gameLoopthread的gameView类代码

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。两者的分离将为您的编码风格带来奇迹。

必须有一些日志。你需要发布你所拥有的。添加的代码,请查看。同意你的意见,使用线程的新手。我在没有加入的情况下尝试了该代码,但它不起作用。我的屏幕在画布上显示精灵,用户单击横幅广告,当他单击后退时,程序应自动恢复,并由系统处理,我不必做任何事情。