2011-04-08 65 views
4

在我的Android應用程序中,我的一個活動包括其他類的實例化。 某些類需要寫入屏幕。我想將所有的佈局交互保持在頂層。 因此,我創建了一個接口,其中包含可以調用以輸出到屏幕的方法列表。然後我在主Activity中實現這個接口。 最後,在實例化類時,我將「this」傳遞給構造函數,並將其保存並用於回調。Android回調 - 這是潛在的內存泄漏嗎?

我的問題是:是否有內存泄漏的危險,因爲我將Activity對象本身傳遞給它的一個對象?

回答

2

我會研究標準的Android Handler機制(同時支持UI更改的自定義回調)。

這裏有一個處理程序定義一個定製的回調處理UI變化的例子:

http://developer.android.com/resources/samples/TicTacToeLib/src/com/example/android/tictactoe/library/GameActivity.html

只要你能保證你的「這」是正常範圍的,你應該是相當安全的,但是,只要你開始將活動傳遞給其他類,它就會對潛在的內存泄漏敞開大門,因爲代碼片段現在可以獲得該實例的暫存,並防止垃圾收集應該在垃圾收集時收集發生在物體上。

+0

我注意到在這個例子中所有的邏輯都包含在Activity類中。就我而言,我想從Activity類外部(從實例化對象)發送回調。我能以同樣的方式做到嗎? – theblitz 2011-04-08 09:21:51

+0

在這種情況下,由於回調需要訪問與活動關聯的視圖,因此您需要傳遞活動。考慮到如果這些回調沒有被其他活動重複使用,理想情況下它們應該被設計爲內部類。但是,由於回調是短暫的,因此對活動的引用不會導致內存泄漏。 – ddewaele 2011-04-08 09:45:11

+0

不是100%確定你的意思。我「回電話」的功能在主要活動類中。然後我使用界面從其他類中的一箇中調用它們。什麼應該被定義爲一個內部類? – theblitz 2011-04-08 11:14:08

2

如果我正確理解你的問題,你已經將一些UI交互功能抽象到一個類中,並用它來修飾你的活動。

對你的問題的簡單答案是否定的。儘管您將「this」的實例傳遞給對象,但對象本身的範圍由Activity控制。實際上,android框架是圍繞上下文傳遞的,與你所做的不一樣。我相信我們都可以同意活動的壽命非常有限。

我想說的第二點是關於整個方法本身。 Android提供了回發到主線程以執行UI交互的機制。 (post或asynctask等)。您應該使用這些機制之一對UI進行一些更改(在主線程中)。所以我的問題是,你能不能寫一個匿名的內部類來使用asynctask來執行這個操作,特別是如果這個功能只對這個Activity唯一的話。