2011-03-25 73 views
3

与许多android编程新手一样,我使用Lunar Lander作为实现SurfaceView的指南。我正在通过创建一个PONG的版本来练习。代码的基本结构与LunarLander相同。很明显,我很快就发现了Lunar Lander的bug。我解决这个问题的直接方式是通过在SurfaceCreated()中实例化一个新的Thread对象并启动它,当原始线程无法启动时(顺便说一句,与许多人建议的方法相同):Android Lunar Lander线程处理替代品

我的主要问题是这是否是一种好的做法?实例化一个新的线程对象意味着实例化游戏所需的所有内容,从而使所有先前实例化的数据悬而未决。如果你看看LunarLander本身,几乎游戏的每个核心组件都在线程中。我读过几个线程,人们跑

System.gc(); 

要做垃圾收集,但这通常被认为是不好的建议。

我想在另一个解决方法,而不是加入SurfaceDestroyed()中的线程,我只是打断它。而且,当活动失去焦点时,我不会让run()返回,而是让其在一切都暂停时在背景中完全没有任何操作。我让onDestroy()在活动生命周期中破坏了一切。希望是所有的数据都不需要重新实例化,而旧数据仍然悬而未决。这可以成为一个合适的选择吗?

在此先感谢。

回答

1

保持焦点丢失时的线程对象肯定是可能的,只要在重新获得焦点时正确完成必要的同步。

但是,为了简单起见,当不注重焦点时释放资源,可以将游戏状态提取到不属于游戏线程的类中,而是在启动时将其传递给线程,从而允许您停止线程surfaceDestroyed()在原始代码中完成。

很明显,每次你松散焦点时,线程对象都会被垃圾回收,但这些微不足道的字节集合应该不成问题。

+0

我改变了我的代码来使用wait()和notify()来代替,这似乎比我在原始文章中提到的更好。但是当游戏不是焦点时,资源总是被释放出来会更好吗? – Dsodo 2011-03-29 19:30:59