2010-06-29 39 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引用的初始化,因此代碼可以編譯。