Android解惑之Handler為什麼需要是static的
我們先來看一張Android Studio中的warning截圖
handler記憶體洩漏.png
上面這段程式碼會引起記憶體洩漏(Memory Leak)。
-
為什麼會引起記憶體洩漏?
我們都知道,非static的內部類會持有外部類的引用,舉個類子來說,我們經常在一些內部類中顯示跳轉activity的時候,給Intent賦值的時候,第一個引數會寫 外部類名.this ,這就是持有外部類的引用的很好表現。 同樣,其他地方需要用到這個內部類的時候,也不能是直接new出來,因為為非static的,必須先通過new出外部類才能。
那麼,現在的情況就是,這個非static的handler內部類,無論是否是匿名的,便會持有外部的activity的引用。
若此時你的handler的訊息佇列中有未處理的Message,在Activity finish之後,Message仍然存在,那麼Handler也仍然存在。由於Handler中有Context的引用,那麼Context也就存在也就存在。而該Context就是我們的Activity,也就是Activity依然純在,那麼我們便是發生了記憶體洩露。
-
那麼為什麼要寫成靜態內部類呢?或者寫成其他單獨的類呢?
隱性匿名類Handler變成static的內部類,由於static的內部類,使用的使用不需要外部類的例項,所以static的內部類和外部類是沒有聯絡的,從而不持有外部類的引用,通過這種方法,我們可以避免該種情況的發生。
將隱性匿名類寫成一個單獨的類(top-level-class),這樣Handler和Context之間就沒有聯絡了。
-
如何寫?
大家都知道,寫成靜態類後,由於其類似於單獨成為了一個類,便不能直接呼叫我們Activity中的一些控制元件了,難不成要把所有的控制元件都寫成static的麼,當然不是
我們通過使Handler持有Activity的一個弱引用來解決這個問題,直接持有Activity的話,我們便與之前的匿名內部類直接持有外部類的引用沒區別了,而持有了弱引用,在Activity有用的情況下,其會被AMS持有強引用,GC不會回收,而當其finish了,便沒有強引用物件持有了,此時GC時便會回收該Activity,我們的Handler由於是持有的弱引用,也不會導致其回收不成功。
來看一個簡單的demo,我們寫一個靜態handler,實現5秒後修改我們佈局中的textview的text。
可以看到,我們的Activity中的TextView成功被修改了。
相關文章
- Android Handler機制之Handler 、MessageQueue 、LooperAndroidOOP
- Java是什麼?主要是幹什麼的?Java
- java主要是做什麼的?Java
- Android 基礎之 HandlerAndroid
- Web前端是什麼?主要是幹什麼的Web前端
- Android Handler機制之ThreadLocalAndroidthread
- Android原始碼學習之handlerAndroid原始碼
- Android 進階 ———— Handler系列之建立子執行緒HandlerAndroid執行緒
- 為什麼Java的main方法必須是public static void?JavaAI
- Android Handler機制之總目錄Android
- Zookeeper叢集節點數量為什麼要是奇數個?
- 為什麼阿里巴巴禁止把SimpleDateFormat定義為static型別的?阿里ORM型別
- Android Handler機制之Message的傳送與取出Android
- Android Handler原理Android
- Android中HandlerAndroid
- Android 之 “只是想來談談 Handler 機制”Android
- Android Handler機制之記憶體洩漏Android記憶體
- Android學習-HandlerAndroid
- Android Handler機制之迴圈訊息佇列的退出Android佇列
- Android 效能優化(十二)之我為什麼寫效能優化Android優化
- Android中Handler的正確使用Android
- Android Handler機制之Message及Message回收機制Android
- Android之Handler訊息傳遞機制詳解Android
- 在公司裡,web前端開發工程師主要是做什麼的?需要掌握什麼Web前端工程師
- Android開發為什麼要用MVP?AndroidMVP
- Android Handler 原始碼探索Android原始碼
- Android Handler 原始碼解析Android原始碼
- Android中使用Handler為何造成記憶體洩漏?Android記憶體
- Android的Handler訊息機制 解析Android
- 桌面運維工程師需要會哪些技能?主要是做什麼的?運維工程師
- Android之什麼是樁程式碼(Stub)?Android
- Android Handler機制之訊息池的擴充套件 SimplePool與SynchronizedPoolAndroid套件synchronized
- Handler全家桶之 —— Handler 原始碼解析原始碼
- PHP 的 new static 和 new self 具體有什麼?PHP
- 為什麼企業需關心DDoS攻擊?—Vecloud微雲Cloud
- 面試官:"Handler的runWithScissors()瞭解嗎?為什麼Google不讓開發者用?"面試Go
- Android訊息機制HandlerAndroid
- Android 8.1 Handler 原始碼解析Android原始碼