Kotlin中的handler如何避免內存泄漏詳解
前言:
哲學老師說,看待事物無非是了解它是什么,為什么,怎么做
所以,首先,我們先了解一下什么是“內存泄漏”
摘自百度的一段話:用動態(tài)存儲分配函數動態(tài)開辟的空間,在使用完畢后未釋放,結果導致一直占據該內存單元。直到程序結束。
是不是有點拗口,換一種說法,有天你去一家飯店吃飯,有個胖子吃完飯了,卻霸占著一張桌子不走,然而現在一堆人等著吃飯,結果那死胖子等到飯店打烊了才離開。
在這個例子中,飯店的桌子就好比內存空間,那個胖子就是一個函數,吃飯就是所執(zhí)行的事件。
這么說是不是好理解多了,現在,我們要做的就是趕走這個死胖子。
Handler在Android開發(fā)中經常使用,一不小心就會陷入內存泄漏的問題,最近在開發(fā)一款Kotlin軟件,針對Handler內存泄漏的問題做出了解決方案
問題分析:
在finish()的時候,Message還沒有被處理,Message持有Handler, Handler持有Activity,這樣阻止了GC對Acivity的回收,就發(fā)生了內存泄露。正確的寫法應該是使用顯形的引用,靜態(tài)內部類與 外部類。使用弱引用WeakReference。 最后在Activity調用onDestroy()的時候要取消掉該Handler對象的Message和Runnable
核心代碼:
private class MyHandler(activity: thisActivity) : Handler() { private val mActivity: WeakReference<thisActivity> = WeakReference(activity) override fun handleMessage(msg: Message) { if (mActivity.get() == null) { return } val activity = mActivity.get() when (msg.what) { 0-> { } else -> { } } } } override fun onDestroy() { // Remove all Runnable and Message. MyHandler(this).removeCallbacksAndMessages(null) super.onDestroy() }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Android添加圖片到ListView或者RecyclerView顯示
這篇文章主要介紹了Android添加圖片到ListView或者RecyclerView顯示的相關資料,需要的朋友可以參考下2016-08-08ListView實現下拉刷新加載更多的實例代碼(直接拿來用)
這篇文章主要介紹了ListView實現下拉刷新加載更多的實例代碼(直接拿來用)的相關資料,需要的朋友可以參考下2016-07-07Android Listview中顯示不同的視圖布局詳解及實例代碼
這篇文章主要介紹了Android Listview中顯示不同的視圖布局詳解及實例代碼的相關資料,需要的朋友可以參考下2017-02-02Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來傳遞參數,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-01-012021最新Android筆試題總結美團Android崗職能要求
這篇文章主要介紹了2021最新Android筆試題總結以及美團Android崗職能要求,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08