Android:使用SurfaceView重新获得焦点

时间:2009-03-23 05:37:24

标签: java android surfaceview

我目前正在掌握Android,玩弄Lunar Lander样本。

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

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

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

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

谢谢!

2 个答案:

答案 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专家可以随意评论!)