使用SurfaceView时是否需要使用单独的线程?

Is it necessary to use a separate thread when using SurfaceView?

在 Android 中,我使用的是 SurfaceView。它位于 FrameLayout 中,用于在一般 XML 布局(使用标准文本视图、按钮等)之上的透明层上绘制一些东西。绘图不涉及非常密集的计算,并且不设置动画, 它仅响应按钮按下而更新。

我看到的所有 SurfaceView 示例都使用单独的线程进行绘图,然后在 OnSurfaceDestroyed 中关闭该线程。

我的代码在不使用单独线程的情况下工作,但它偶尔会 crash/freeze,尤其是在 orientations/applications 和

之间切换时

所以我的问题是,我是否需要使用额外的线程来防止这些崩溃。如果没有,我应该在 OnSurfaceDestroyed 中做任何其他具体的事情吗? (我不想 post 我的所有代码都在这里,只是在几句话中寻找简单的 yes/no 响应和原因)。

不需要有一个单独的线程,但这通常是个好主意。

例如,看看 Grafika's "multi-surface test" Activity。它有三个重叠的 SurfaceView,它们是从 UI 线程渲染的。如果你点击 "bounce" 按钮,它会启动一个新线程来控制动画,因为这样做更简单(它可以坐在一个循环中绘制,而不是必须 post 定时绘制事件到 UI 循环器)。当 Activity 暂停时,反弹线程停止。请注意,代码在 surfaceDestroyed().

中没有执行任何操作

SurfaceView 与 Activity 生命周期之间的交互可能很棘手。可以找到讨论 here.

(它 can be tricky 让一切都正确。)