欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin中的handler如何避免內(nèi)存泄漏詳解

 更新時(shí)間:2017年12月17日 08:44:09   作者:Donkor-  
Handler,我們已經(jīng)相當(dāng)熟悉了,而且經(jīng)常用得不亦樂(lè)乎,但就是因?yàn)樘煜ち?,才?huì)偶爾被它反捅一刀,血流不止,下面這篇文章主要給大家介紹了關(guān)于Kotlin中handler如何避免內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下。

前言:

哲學(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)文章

最新評(píng)論