在onCreate()方法中,我们启动了全屏幕模式,创建FastRenderView实例并将其设置为活动的内容视图。
这次我们重写了onResume()方法。在该方法中,我们通过调用FastRenderView.resume()方法间接启动渲染线程,该方法将在内部处理所有操作。这就意味着该线程在活动创建时就启动(在执行onCreate()之后总是会调用onResume()方法)。当该活动从暂停状态恢复时,也将重新启动该线程。
当然,这也意味着我们必须在某个地方停止该线程;否则,我们需要在每次调用onResume()方法时创建一个新的线程。应该在onPause()方法内执行该操作。当调用FastRenderView.pause()方法时,将会完全停止该线程。该方法在线程完全停止之前不会返回。
在这里running标志的volatile修饰符,为什么需要它?原因很微妙:当编译器知道在方法的第一行与while块之间没有依赖关系时,它将会决定在FastRenderView.pause()方法中重新排序语句。只要它认为这样做能加快代码执行速度,它就允许这样做。不过,我们还是依赖在该方法中指定的顺序。试想一下,如果我们试图连接线程之后设置running标志会怎么样。我们将会进入一个无限的循环,并且线程永远无法终止。
volatile修饰符就是为了防止这种情况发生,任何引用改成员的语句都将按顺序执行。这就避免了我们处理一个没有能力进行完全再现的BUG。
在我们从活动的onPause()方法返回后,Surface将总是被销毁。因为我们通过FastRenderView.pause()方法进行等待直到线程销毁,当Surface被真正销毁之后,渲染线程将不可能存活。
运行效果: