我的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。它没有崩溃,但没有带来原始线程所以它没有显示画布或精灵,思想加入应该这样做。
答案 0 :(得分:0)
你似乎对如何在Java中使用Threads感到困惑。
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
加入将阻塞直到线程死亡。
很难对你的代码发表评论,因为GameView构建的时间或方式并不明显,也不是你用GameLoopThread得到的东西。我怀疑你想要从GameView控制线程生命周期而不是从SurfaceHolder回调控制。我还建议您使用普通的Thread对象并将Runnable传递给它,以实现您的逻辑。两者的分离将为您的编码风格带来奇迹。