2010-06-29 73 views
1

在Lunar Lander示例中(由Google的Android站点提供),在名为“run()”的方法中有一个主循环。这是如下:Lunar Lander中的Android垃圾收集

 @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); 
        } 
       } 
      } 
     } 

所以,现在,我的问题是这样的:保持零循环,因此导致更多的垃圾收集是不是很糟糕?也许我不太了解这一点,但为什么它一定是空的?

回答

1

这并不差,它可以确保Canvas对象在重新创建时具有0或空引用。这是很好的编程习惯。

另请注意,如果有一个有效的Canvas对象存在,最终语句会清除它。如果它为空,那么将其重置为null不会有任何缺点。没有惩罚或额外清理所需。记住一个对象有一个地址,并且对null的引用确保它不指向可能潜伏的某个有效对象(尚未清理)。

此外,垃圾收集器不会在初始化变量为空时调用。它仅仅意味着对象不会引用当前可能在内存中的任何内容。

+0

循环中对象的重新创建不会导致垃圾回收? – Eugene 2010-06-29 18:36:01

+0

@Eugene - 如果你正在实例化和分配内存给对象,那么是的。您将强制定期进行垃圾回收以释放该内存。 Android站点在你的应用程序中调用这些'打嗝'。但是将null分配给对象并不是一回事。 – JonH 2010-06-29 18:42:24

+0

好吧,我想我明白每个人的答案。感谢您的帮助! – Eugene 2010-06-29 18:45:28

0

最初将c分配给null不会导致垃圾回收器运行。 C没有指向一个对象,因此没有收集任何东西。你所做的只是确保它没有任何意义。此外,可能还有其他对画布对象的引用,c指向含义,因为c不再指向它,并不一定意味着它已准备好收集。

1

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