Kotlin中的handler如何避免內(nèi)存泄漏詳解
前言:
哲學(xué)老師說,看待事物無非是了解它是什么,為什么,怎么做
所以,首先,我們先了解一下什么是“內(nèi)存泄漏”
摘自百度的一段話:用動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)開辟的空間,在使用完畢后未釋放,結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單元。直到程序結(jié)束。
是不是有點(diǎn)拗口,換一種說法,有天你去一家飯店吃飯,有個(gè)胖子吃完飯了,卻霸占著一張桌子不走,然而現(xiàn)在一堆人等著吃飯,結(jié)果那死胖子等到飯店打烊了才離開。
在這個(gè)例子中,飯店的桌子就好比內(nèi)存空間,那個(gè)胖子就是一個(gè)函數(shù),吃飯就是所執(zhí)行的事件。
這么說是不是好理解多了,現(xiàn)在,我們要做的就是趕走這個(gè)死胖子。
Handler在Android開發(fā)中經(jīng)常使用,一不小心就會(huì)陷入內(nèi)存泄漏的問題,最近在開發(fā)一款Kotlin軟件,針對(duì)Handler內(nèi)存泄漏的問題做出了解決方案
問題分析:
在finish()的時(shí)候,Message還沒有被處理,Message持有Handler, Handler持有Activity,這樣阻止了GC對(duì)Acivity的回收,就發(fā)生了內(nèi)存泄露。正確的寫法應(yīng)該是使用顯形的引用,靜態(tài)內(nèi)部類與 外部類。使用弱引用WeakReference。 最后在Activity調(diào)用onDestroy()的時(shí)候要取消掉該Handler對(duì)象的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()
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
android使用AsyncTask實(shí)現(xiàn)多線程下載實(shí)例
這篇文章主要介紹了android使用AsyncTask實(shí)現(xiàn)多線程下載實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Android?Studio?Electric?Eel支持手機(jī)投屏
這篇文章主要為大家介紹了Android?Studio?Electric?Eel支持手機(jī)投屏功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
基于Android實(shí)現(xiàn)一個(gè)常用的布局吸頂效果
這篇文章給大家介紹一個(gè)布局吸頂效果,一般出現(xiàn)在內(nèi)容較長(zhǎng)頁面還嵌套著分類頁面的情況,比如電商的詳情頁嵌套分類,在頁面滑動(dòng)到tab的時(shí)候我們希望tab還能保留在頁面頂部而不被頂上去,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09
詳細(xì)解讀Android系統(tǒng)中的application標(biāo)簽
這篇文章主要介紹了Android系統(tǒng)中的application標(biāo)簽,以application來聲明App是Android入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-04-04
Android 應(yīng)用更換皮膚實(shí)現(xiàn)方法
本文主要介紹Android 應(yīng)用更換皮膚,Android應(yīng)用如果想更換皮膚這里幫大家整理了相關(guān)資料,有需要的小伙伴可以參考下2016-08-08
Android關(guān)于獲取時(shí)間的記錄(小結(jié))
這篇文章主要介紹了Android關(guān)于獲取時(shí)間的記錄(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

