




非靜態匿名內部類為何會持有外部類的引用呢?靜態匿名內部類不持有外部對象的引用
非靜態態內部類里面不允許有靜態方法(因為非靜態內部類方法的調用必須依賴外部對象的創建)。The method test cannot be declared static; static methods can only be declared in a static or top level type
外部類:


外部類不持有MainActivity的引用
在Android中,長時間運行的任務和Acyivity生命周期進行協調會有點困難,如果你不加以小心的話會導致內存泄漏。關于如何處理這個棘手的問題,下面有幾個基本的技巧供參考 1、使用靜態內部類/匿名類,不要使用非靜態內部類/匿名類.非靜態內部類/匿名類會隱式的持有外部類的引用,外部類就有可能發生泄漏。而靜態內部類/匿名類不會隱式的持有外部類引用,外部類會以正常的方式回收,如果你想在靜態內部類/匿名類中使用外部類的屬性或方法時,可以顯示的持有一個弱引用。 2、不要以為java永遠會幫你清理回收正在運行的threads.在上面的代碼中,我們很容易誤以為當Activity結束銷毀時會幫我們把正在運行的thread也結束回收掉,但事情永遠不是這樣的!Java threads會一直存在,只有當線程運行完成或被殺死掉,線程才會被回收。所以我們應該養成為thread設置退出邏輯條件的習慣。 3、適當的考慮下是否應該使用線程.Android應用框架設計了許多的類來簡化執行后臺任務,我們可以使用與Activity生命周期相關聯的Loaders來執行簡短的后臺查詢任務。如果一個線程不依賴與Activity,我們還可以使用Service來執行后臺任務,然后用BroadcastReceiver來向Activity報告結果。另外需要注意的是本文討論的thread同樣使用于AsyncTasks,AsyncTask同樣也是由線程來實現,只不過使用了Java5.0新增并發包中的功能,但同時需要注意的是根據官方文檔所說,AsyncTask適用于執行一些簡短的后臺任務新聞熱點
疑難解答