【发布时间】:2015-04-22 11:56:46
【问题描述】:
我遇到了SurfaceView 问题,这个问题似乎与对这些SurfaceView 回调如何工作的任何误解有关。
让我们尝试从理论上解决这个问题:
我有一个活动A,托管一个fragment,它正在实时绘制一个对象,运行一个thread来完成这个任务(定期调用我的View的绘图方法并将其绘制在SurfaceView)。
然后我切换到活动 B,它承载了另一个显示一些 UI 的片段。
每当我切换到这个活动 B 时,我可以看到 SurfaceView 正在被销毁,因此会调用 onSurfaceDestroyed() 回调并在那里停止我的绘图线程。
现在一切都很好而且很明显,但是当我回到活动 A 时,SurfaceView 没有被创建,所以onSurfaceCreated() 没有被调用,因此我的绘图线程不会启动。
通过调试,我可以看到我的View在我从B返回到A时存在,如果线程正在运行,它可以被绘制,但对于我的线程运行,我需要再次创建SurfaceView。
所以,我的问题(已编辑):
如果片段可见,为什么当我返回片段 A 时没有创建 SurfaceView?
很抱歉,我无法为这个问题提供任何代码,但它比任何其他类型都更具理论性。
编辑:进度更新
在做了更多的研究和测试之后,我意识到任何片段的onCreateView()在它的生命周期中只被调用一次,直到它从片段管理器中删除并且不再由框架管理。
SurfaceView 在使用它的片段不再可见时被销毁,然后调用它为onDestroyView(),但遗憾的是(我不明白为什么)当它再次可见时不会重新创建,这就是我的问题的根源。我需要在该片段可见时再次创建 SurfaceView,以便它可以在框架调用 onSurfaceCreated() 时启动我的绘图线程。
我尝试绘制的布局由两个视图组成,一个由框架管理,另一个由 SurfaceView 绘制。当我从 B 回到活动 A 时,我知道该片段是可见的,因为我可以看到框架管理的视图被适当地绘制,但没有任何管理的痕迹由创建SurfaceView 时启动的线程,因为尚未创建此SurfaceView。
【问题讨论】:
-
如果 SurfaceView 的
onSurfaceDestroyed()被调用,那么onSurfaceCreated()应该被调用。onSurfaceChanged()在表面的大小或格式发生变化时被调用。请注意,这些是由应用程序框架调用的——永远不要从应用程序中调用它们。可以在此处找到一些附加说明:source.android.com/devices/graphics/architecture.html#activity -
感谢您的评论。我让框架自己调用这些回调,但问题似乎是我没有实例化必须在 A 片段内正确绘制的视图。我再次调试,发现片段 A 没有调用
onCreateView(),而是调用onResume(),当我从活动 B 回到活动 A 并显示片段时。解释得一团糟:P。明天我会尝试找出这种奇怪的行为。 -
@fadden 我已经用更多信息更新了这个问题。
onSurfaceCreated()不会在片段再次可见时触发,尽管在片段由于活动切换而不再可见时调用了onSurfaceDestroyed()。
标签: android android-fragments android-activity surfaceview