目前我越来越到与Android握把,与月球着陆样品玩耍。

我发现,如果从应用程序导航离开(如,打的呼叫按钮),它会破坏下垫面(调用surfaceDestroyed)。

导航背面(其将触发onWindowVisibilityChanged)应用程式会崩溃,因为它会尝试绘制到表面而无需重新创建它。

有一些代码,我可以把onWindowVisibilityChanged(或其他地方),将重新生成SurfaceView的下垫面,并很好地继续执行?

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

谢谢!

有帮助吗?

解决方案 2

误诊断!该应用程序自动地重新创建的表面上,但有一个在那里,试图真实创建之前绘制到它的调用。

修复该问题:

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的专家随意评论,如果这是不好的做法)

其他提示

此溶液为“mSurfaceExists =真”不工作为我任一。它看起来像surfaceCreated()是没有得到调用,因为super.onWindowVisibilityChanged()没有被调用。所以没有表面创建,它不会崩溃,因为threas.start不叫。

我相信问题是: 调用thread.start()导致错误,因为线程已经启动。 但在surfaceDestroyed()的Thread.join导致线程来完成和死亡。并且一个线程无法重新启动,一旦死了。

我猜测,关键是要建立在surfacecreated或只有一个新的线程导致线程当用户调用应用程序完成(返回键),而不是暂停(Home键)来完成。这可以通过在活动呼叫isFinishing()进行检查。

不知道这是否会工作。我将尽快尝试此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top