2011-05-21 135 views
1

我注意到這個行爲,同時開發一個簡單的Android遊戲,它有2個活動。Android活動垃圾收集

遊戲有2個活動,第一個是允許用戶選擇對手類型,等級和第二個實際遊戲屏幕的屏幕。 第二個活動創建GameManager類的一個對象,該類處理所有遊戲處理。 這個GameManager類還創建一個CountDownTimer,它開始提示用戶輸入(超時時遊戲默認給對手)。

我注意到,如果用戶退出第二個活動(返回到第一個),然後再次啓動一個新遊戲,則前一個定時器仍在運行直到完成。 我通過顯式取消定時器(來自第二個活動的onDestroy())來處理此事,因爲只將timerobject設置爲'null'未取消定時器。

但是我很好奇,爲什麼前面的計時器在第一次退出我的活動後仍在運行? GC應該不會刪除第二個Activity實例化的所有對象(以及它創建的任何子對象)嗎?知道觀察到的行爲背後的原因會很好嗎?

TIA

回答

4

不應該GC已經刪除第二活動實例化的所有對象(對象和它創造的任何孩子),當它退出?

這不是Garbage Collection的工作原理。 GC不負責'刪除對象' - 它負責拾取'孤立'對象並釋放資源。即使如此,GC也不保證及時得到所有的孤兒。除此之外,如果您的代碼沒有這樣做,任何可能是「系統」對象並且需要明確釋放的對象都可能永遠不會被釋放。 GC的其他問題可能包括創建其他線程(創建它們的Activity除外)可能參考的對象。

你提到你的'計時器',但不要解釋你正在使用什麼樣的課程。我建議仔細閱讀關於該課程的內容,看看這些內容對ceation /刪除有什麼影響(可能是明確的「釋放」資源)。

GC是任何平臺上非常灰暗的區域。對於Android來說,它通常非常直接,但是由於Activity生命週期的特性,很難預測會發生什麼。

通常在活動中使用onCreate,onPause和onResume以及諸如savedInstanceState和SharedPreferences之類的東西來跟蹤發生了什麼。

+0

正如我在第一篇文章中提到的,我正在使用'CountDownTimer'(來自android.os.CountDownTimer)。猜猜這不是所有衆所周知的:) - http://developer.android.com/reference/android/os/CountDownTimer.html沒有太多關於創建/刪除這個。嗯..所以我想把它設置爲null是沒有幫助的呢? – 2011-05-21 11:24:11

+0

@ source.rar:道歉,回頭看我現在看到。因爲它是一個抽象類和android.os的一部分,那麼將任何引用設置爲'null'不會像普通類一樣工作。正如你發現的那樣,你需要明確地調用它的cancel()方法 - 這是我理解一個類的細節(比如它是抽象等)並相應地處理它的關鍵。有時需要在系統級調用諸如「取消」或「發佈」等方法。但是,對於這類類,您自己的應用程序不支持GC。 – Squonk 2011-05-21 11:37:33

+0

謝謝。所以一般來說,在Android中,程序員如何知道要注意這種行爲? – 2011-05-21 15:04:54

0

CountDownTimer未綁定到您已經發現的活動。在這些情況下需要注意的是,一個類在其構造函數中不會收到任何Context。因此它不能被綁定到一個活動。

+0

聽起來不太好。然後,任何不接受上下文的用戶對象都不會被綁定到活動,也不會被GCed。 – Kiran 2015-05-24 03:04:05