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

时间:2014-01-21 14:39:33

标签: android multithreading admob android-canvas

我的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。它没有崩溃,但没有带来原始线程所以它没有显示画布或精灵,思想加入应该这样做。

1 个答案:

答案 0 :(得分:0)

你似乎对如何在Java中使用Threads感到困惑。

http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()

加入将阻塞直到线程死亡。

很难对你的代码发表评论,因为GameView构建的时间或方式并不明显,也不是你用GameLoopThread得到的东西。我怀疑你想要从GameView控制线程生命周期而不是从SurfaceHolder回调控制。我还建议您使用普通的Thread对象并将Runnable传递给它,以实现您的逻辑。两者的分离将为您的编码风格带来奇迹。