Android Lunar Lander线程处理替代方案

时间:2011-03-25 11:05:16

标签: java android multithreading android-activity

像许多Android编程新手一样,我使用Lunar Lander作为实现SurfaceView的指南。我正在练习创建一个PONG版本。代码的基本结构与LunarLander相同。显然,我很快就发现了月球登陆器中的错误。我解决这个问题的直接方法是在SurfaceCreated()中实例化一个新的Thread对象并启动它,当原始线程无法启动时(顺便提一下,这是很多人建议的方法):

我的主要问题是这是否真的是好的做法?实例化新的线程对象意味着实例化游戏所需的一切,从而使所有先前实例化的数据保持悬空状态。如果你看看LunarLander本身,几乎游戏的每个核心组件都在线程中。我读了一些人们跑的话题

System.gc();

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

我正在尝试另一种解决方法,而不是在SurfaceDestroyed()中加入线程,我只是打断它。此外,当活动失去焦点时,我不会让run()返回,但是当其他所有内容都暂停时,它会在后台执行任何操作。我让onDestroy()在活动生命周期中摧毁一切。希望是所有数据都不需要重新实例化,而旧数据则悬而未决。这可能是一个合适的选择吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

显然每次松开焦点时线程对象都会是垃圾,但这些微小字节的集合应该不是问题。