Kotlin中的handler如何避免內(nèi)存泄漏詳解
前言:
哲學(xué)老師說(shuō),看待事物無(wú)非是了解它是什么,為什么,怎么做
所以,首先,我們先了解一下什么是“內(nèi)存泄漏”
摘自百度的一段話(huà):用動(dòng)態(tài)存儲(chǔ)分配函數(shù)動(dòng)態(tài)開(kāi)辟的空間,在使用完畢后未釋放,結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單元。直到程序結(jié)束。
是不是有點(diǎn)拗口,換一種說(shuō)法,有天你去一家飯店吃飯,有個(gè)胖子吃完飯了,卻霸占著一張桌子不走,然而現(xiàn)在一堆人等著吃飯,結(jié)果那死胖子等到飯店打烊了才離開(kāi)。
在這個(gè)例子中,飯店的桌子就好比內(nèi)存空間,那個(gè)胖子就是一個(gè)函數(shù),吃飯就是所執(zhí)行的事件。
這么說(shuō)是不是好理解多了,現(xiàn)在,我們要做的就是趕走這個(gè)死胖子。
Handler在Android開(kāi)發(fā)中經(jīng)常使用,一不小心就會(huì)陷入內(nèi)存泄漏的問(wèn)題,最近在開(kāi)發(fā)一款Kotlin軟件,針對(duì)Handler內(nèi)存泄漏的問(wèn)題做出了解決方案
問(wèn)題分析:
在finish()的時(shí)候,Message還沒(méi)有被處理,Message持有Handler, Handler持有Activity,這樣阻止了GC對(duì)Acivity的回收,就發(fā)生了內(nèi)存泄露。正確的寫(xiě)法應(yīng)該是使用顯形的引用,靜態(tài)內(nèi)部類(lèi)與 外部類(lè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à)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Android實(shí)現(xiàn)調(diào)用攝像頭拍照與視頻功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)調(diào)用攝像頭拍照與視頻功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android添加圖片到ListView或者RecyclerView顯示
這篇文章主要介紹了Android添加圖片到ListView或者RecyclerView顯示的相關(guān)資料,需要的朋友可以參考下2016-08-08
ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)
這篇文章主要介紹了ListView實(shí)現(xiàn)下拉刷新加載更多的實(shí)例代碼(直接拿來(lái)用)的相關(guān)資料,需要的朋友可以參考下2016-07-07
Android Listview中顯示不同的視圖布局詳解及實(shí)例代碼
這篇文章主要介紹了Android Listview中顯示不同的視圖布局詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù)
這篇文章主要介紹了Android 中為什么要用Fragment.setArguments(Bundle bundle)來(lái)傳遞參數(shù),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01
Android編程實(shí)現(xiàn)自定義toast示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義toast,結(jié)合簡(jiǎn)單實(shí)例形式分析了自定義布局toast核心實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
2021最新Android筆試題總結(jié)美團(tuán)Android崗職能要求
這篇文章主要介紹了2021最新Android筆試題總結(jié)以及美團(tuán)Android崗職能要求,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

