安卓:使用SurfaceView重获焦点
-
21-08-2019 - |
题
目前我越来越到与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()进行检查。
不知道这是否会工作。我将尽快尝试此。
不隶属于 StackOverflow