我目前正在掌握Android,玩弄Lunar Lander样本。
我发现如果您离开应用程序(例如,点击通话按钮),它将破坏底层表面(调用surfaceDestroyed
)。
向后导航(将触发onWindowVisibilityChanged
)应用程序将崩溃,因为它将尝试绘制到曲面而不重新创建它。
我可以在onWindowVisibilityChanged
(或其他任何地方)放置一些代码来重新生成SurfaceView的底层表面并很好地恢复执行吗?
感觉这应该是一个简单的函数调用,但我在API文档中找不到任何内容。
谢谢!
答案 0 :(得分:2)
“mSurfaceExists = true”的解决方案对我来说也不起作用。看起来像surfaceCreated()没有被调用,因为没有调用super.onWindowVisibilityChanged()。因此没有创建表面并且它不会崩溃因为没有调用threas.start。
我认为问题是: 调用thread.start()会导致错误,因为该线程已经启动。 但是在surfaceDestroyed()中,thread.join导致线程完成并死掉。并且线程一旦死亡就无法重启。
我猜测的诀窍是在surfacecreated中创建一个新线程,或者只在用户调用应用程序完成(后退键)而不是暂停(home键)时才使线程完成。这可以通过在活动上调用isFinishing()来检查。
不确定这是否有效。我很快就会尝试这个。
答案 1 :(得分:1)
误诊断!该应用程序会自动重新创建曲面,但是在那里有一个调用,它会在创建之前尝试绘制它。
解决问题:
boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
mSurfaceExists = false;
...
}
public void surfaceCreated(SurfaceHolder holder) {
mSurfaceExists = true;
...
}
protected void onWindowVisibilityChanged(int visibility) {
// only call base if there's a surface
if(mSurfaceExists)
super.onWindowVisibilityChanged(visibility);
}
现在一切都在膨胀。 (据我所知,无论如何 - 如果这是不好的做法,Java / Android专家可以随意评论!)