Lunar Lander中的Android垃圾收集

时间:2010-06-29 18:29:02

标签: java android

在Lunar Lander示例中(由Google的Android站点提供),在名为“run()”的方法中有一个主循环。它在下面:

        @Override
        public void run() {
            while (mRun) {
                Canvas c = null;
                try {
                    c = mSurfaceHolder.lockCanvas(null);
                    synchronized (mSurfaceHolder) {
                        if (mMode == STATE_RUNNING) updatePhysics();
                        doDraw(c);
                    }
                } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }

所以现在,我的问题是:在每个循环中保持归零并因此导致更多的垃圾收集是不是很糟糕?也许我不太了解这一点,但为什么一定要把它弄清楚?

3 个答案:

答案 0 :(得分:1)

它一点也不差,它确保Canvas对象在重新创建时具有0或null引用。这是一个很好的编程实践。

另请注意finally语句,确保如果存在有效的Canvas对象,则清除它。如果它为null然后将其重置为null没有任何缺点。不需要处罚或额外清理。记住一个对象有一个地址,并且对null的引用确保它没有指向一些可能潜伏的有效对象(尚未清理)。

除了在将变量初始化为null时不调用垃圾收集器。它只是意味着该对象不会引用当前可能存在于内存中的任何内容。

答案 1 :(得分:1)

如果您指的是Canvas c = null;行 - 它根本与GC无关。它是本地Canvas引用c的初始化,因此代码可以编译。

答案 2 :(得分:0)

最初将c分配给null不会导致垃圾收集器运行。 C没有指向一个物体,因此没有什么可收集的。你所做的只是确保它什么都不是。另外,可能还有其他对canvas对象的引用,c表示只是因为c不再指向它,并不一定意味着它已经准备好被收集了。