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成功被修改了。
相關文章
- Java是什麼?主要是幹什麼的?Java
- java主要是做什麼的?Java
- Web前端是什麼?主要是幹什麼的Web前端
- Android之HandlerAndroid
- Android Handler機制之Handler 、MessageQueue 、LooperAndroidOOP
- Android 基礎之 HandlerAndroid
- Android開發之HandlerAndroid
- 為什麼Java的main方法必須是public static void?JavaAI
- soa是什麼?主要是那些技術
- 為什麼阿里巴巴禁止把SimpleDateFormat定義為static型別的?阿里ORM型別
- Android 進階 ———— Handler系列之建立子執行緒HandlerAndroid執行緒
- Android原始碼學習之handlerAndroid原始碼
- Android Handler機制之ThreadLocalAndroidthread
- Android 從java位元組碼告訴你 為什麼Handler會造成記憶體洩露AndroidJava記憶體洩露
- 面試官:"Handler的runWithScissors()瞭解嗎?為什麼Google不讓開發者用?"面試Go
- Android 事件分發完全解析之為什麼是她Android事件
- 解惑:為什麼不用家用電腦代替公網雲伺服器伺服器
- Android中的handlerAndroid
- Android Handler機制之總目錄Android
- [Handler]android-Handler解釋Android
- 在歐洲,購買電動汽車的障礙主要是什麼?
- 在公司裡,web前端開發工程師主要是做什麼的?需要掌握什麼Web前端工程師
- Android為什麼選擇binderAndroid
- 為什麼我做的Android app會那麼卡?AndroidAPP
- Android中Handler的使用Android
- 深入探索Android訊息機制之HandlerAndroid
- 為什麼企業需關心DDoS攻擊?—Vecloud微雲Cloud
- Android 效能優化(十二)之我為什麼寫效能優化Android優化
- 為什麼沒有好用的Android遊戲引擎?Android遊戲引擎
- Android中HandlerAndroid
- Android Handler原理Android
- Android開發為什麼要用MVP?AndroidMVP
- PHP 的 new static 和 new self 具體有什麼?PHP
- Android Handler機制之Message的傳送與取出Android
- Android 面試(五):探索 Android 的 HandlerAndroid面試
- 為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?程式設計師
- 為什麼你學不好Web前端?這些原因你需瞭解Web前端
- Android記憶體優化之static使用篇Android記憶體優化