启用设备密码屏幕时游戏崩溃
问题描述:
使用Microsft Exchange时,Android会激活密码屏幕,用户需要在每次打开设备时都要通过密码屏幕。启用设备密码屏幕时游戏崩溃
我正在制作一个使用由线程运行的SurfaceView的游戏。我正在使用很多静态变量。如果设备在播放过程中被关闭,当我回来并输入密码时,游戏屏幕会显示一些位图大小不正确的图像并被冻结。
在日志中,我看到第一个NullPointerException与非UI线程,然后ANR错误。它看起来像关闭设备已经销毁了我的应用程序的一些对象,但它没有再次通过onCreate和SurfaceView构造函数。
当通过电话或单击HOME按钮暂停游戏时,我没有任何问题。另外在其他两种设备上,游戏在游戏中途关闭和打开后仍能正常工作,但它们没有安全屏幕。
我使用的Galaxy Tab,OS 2.2
编辑: 后在线程中打印堆栈跟踪,我得到
android.graphics.Canvas.throwIfRecycled
似乎我的一些位图已被回收。任何想法如何在onResume或surfaceChanged()中检测到这一点,它总是在返回到应用程序时触发?
答
目前,我对这个问题的解决方案是关闭这个活动,如果它没有恢复正确的事件序列。如果onSurfaceChanged发生而没有onSurfaceCreated先发生,则关闭此活动。游戏的状态仍然可以保留,当玩家重新开始这个活动时,它会继续停止。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
//if it does not start through surfaceCreated close activity
// because some bitmaps could be recycled and crash the application
if (!surfaceCreatedFirst){
_thread.setRunning(false); //stop the thread
((Activity) context1).finish(); //close activity
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
surfaceCreatedFirst = true;
_thread = new FootballThread(holder, this);
_thread.setRunning(true);
_thread.start();
}
堆栈跟踪真的会有所帮助。您的游戏在通电时是否重新启动?你是否将任何数据保存到db/file/preferences? – 2011-04-12 15:35:28
发布您在日志中获得的内容,以便我们找到某些内容 – 2011-04-12 15:37:45