2014-06-18 56 views
1

我知道爲什麼使用靜態處理程序是一個好主意(避免處理程序正在處理時發生內存泄漏)。然而,我讀過的大部分內容似乎暗示它是爲了防止應用程序/上下文泄漏。所有示例代碼都有一個Activity或Service作爲外部類。例如,這個經常鏈接的帖子談到泄漏的上下文和視圖(http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html)。它以「底線是什麼」結尾?如果內部類的實例超出了活動的生命週期,那麼避免在活動中使用非靜態的內部類,而應該選擇靜態的內部類,並且對內部的活動持有一個弱引用。可以在非活動類中使用非靜態處理程序嗎?

這是否意味着如果擁有的類沒有與Android生命週期相關的任何字段並且不是Activity/Service /等,則可以使用非靜態Handler?我本來會這麼想的,但林特警告並不關心外部階級是什麼階級。我知道我仍然可以泄漏我的外部類和領域,但在我的情況下,至少它幾乎沒有。

回答

0

我不會說這沒關係,但也許不那麼糟糕。上下文特別沉重。泄漏你的封閉課堂可能不是什麼大事。然後,它可能會。

基本上,處理器泄漏發生在消息發佈延遲時。消息包含對處理程序的引用,因此處理程序保持可到達狀態直到處理消息。並且請注意,即使沒有明確的延遲,Looper隊列中可能還有其他任務必須在處理消息之前完成,因此可能會稍微延遲。如果上下文(或其他處理程序引用的內容)在此期間失效,則可能導致錯誤。

+0

雖然我怎麼會泄漏上下文?在我的情況下,外部類只有兩個字段(兩個字符串數組),並沒有擴展任何內容。當然,處理程序會以某種方式引用上下文,但除非我誤認爲我無法避免處理程序自身泄漏,對嗎?處理程序是否具有對其外部類的引用對它是否泄漏沒有影響;它只會影響泄漏時發生的情況。 –

+0

處理程序引用上下文的常用方法是作爲Activity的非靜態內部類,因此具有對Activity的隱式引用。這聽起來像你理解這一點。我並不是想暗示你的處理程序必然會泄露一個上下文。 –

相關問題