6

我目前正在使用 Android,正在使用 Lunar Lander 示例。

我发现如果您离开应用程序(例如,点击呼叫按钮),它将破坏底层表面(呼叫surfaceDestroyed)。

向后导航(这将触发onWindowVisibilityChanged)应用程序将崩溃,因为它将尝试绘制到表面而不重新创建它。

是否有一些我可以放入onWindowVisibilityChanged(或其他任何地方)的代码来重新生成 SurfaceView 的底层表面并很好地恢复执行?

感觉这应该是一个简单的函数调用,但我在 API 文档中找不到任何内容。

谢谢!

4

2 回答 2

2

“mSurfaceExists = true”的这个解决方案也不适合我。看起来 surfaceCreated() 没有被调用,因为 super.onWindowVisibilityChanged() 没有被调用。所以没有创建表面并且它不会崩溃,因为 threas.start 没有被调用。

我认为问题是:调用 thread.start() 会导致错误,因为线程已经启动。但是在surfaceDestroyed() 中,thread.join 导致线程完成并死亡。并且线程一旦死了就无法重新启动。

我猜这个技巧是在surfacecreated中创建一个新线程,或者只在用户调用应用程序完成(返回键)而不是暂停(home键)时才导致线程完成。这可以通过在活动上调用 isFinishing() 来检查。

不确定这是否可行。我很快就会尝试这个。

于 2010-11-04T20:28:54.460 回答
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 专家可以随时发表评论!)

于 2009-03-23T06:45:22.380 回答