基于Kotlin解決Android中Handler內(nèi)存泄漏問題

作為Android開發(fā)者,我們都知道,當(dāng)我們在子線程處理完耗時任務(wù)后刷新UI時,一般會借助于 `Handler` 來實(shí)現(xiàn)。關(guān)于handler具體用法這里不做說明了,在使用 `Handler` 時一般會遇到內(nèi)存泄漏的隱患,同時編譯器也會給出一大片黃色的警告,在兩者驅(qū)使下,我們勢必要對其暴露的問題進(jìn)行合理解決。

? 關(guān)于Handler內(nèi)存泄漏原因的詳細(xì)分析可以參考該文章:http://www.itdecent.cn/p/f2f186e3dd3e。

這里我們主要來看一下在kotlin語言下如何處理handler內(nèi)存泄漏問題。一般地,我們都會借助于靜態(tài)內(nèi)部類與弱引用來處理這類問題,kotlin中也不例外,這里以在fragment中為例,來看看實(shí)現(xiàn)代碼吧:

private var handler: Handler = WithoutLeakHandler(this)

companion object {
        const val GET_LOCAL_VIDEOS: Int = 100
        /**
         * by moosphon on 2018/09/16
         * desc: 解決handler內(nèi)存泄漏的問題,消息的處理需要放在內(nèi)部類的{@link #Handler.handleMessage}
         */
        private class WithoutLeakHandler( fragment: VideoLocalFragment) : Handler(){
            private var mFragment: WeakReference<VideoLocalFragment> = WeakReference(fragment)

            override fun handleMessage(msg: Message) {
                super.handleMessage(msg)
                when(msg.what){
                    GET_LOCAL_VIDEOS -> {
                        val fragment = mFragment.get()

                        Log.e("VideoLocalFragment", "收到視頻搜索完畢的消息了")
                        if (fragment != null){
                            fragment.adapter.setData(fragment.videoData!!)
                            fragment.fm_video_local_rv.adapter = fragment.adapter
                        }

                    }
                }
            }
        }
    }
    
    ......
    
     Thread(Runnable {
            videoData = MediaUtils.getLocalVideos(context)
            Log.e("VideoLocalFragment", "掃描本地視頻的數(shù)量為->"+videoData?.size)
            val message= Message()
            message.what = GET_LOCAL_VIDEOS
            handler.sendMessage(message)
        }).start()
    

在kotlin中,我們需要在靜態(tài)類 WithoutLeakHandler 中重寫 handleMessage 方法,并在里面處理消息和刷新UI。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 13,899評論 2 59
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 【Android Handler 消息機(jī)制】 前言 在Android開發(fā)中,我們都知道不能在主線程中執(zhí)行耗時的任務(wù)...
    Rtia閱讀 5,076評論 1 28
  • DAY38:我與有書兩周年的故事 #遇見你,是最美麗的意外。# 昨天,“雙十二”,是有書兩周年的生日。祝有書兩周年...
    書香是佳閱讀 343評論 0 2
  • 六歲那年,他抓住了那只蟬,便以為轉(zhuǎn)抓了整個夏天。 十六歲那年,他吻過她的臉,便以為能和他到永遠(yuǎn)。 是不是一個人過久...
    胡里胡屠閱讀 169評論 0 0

友情鏈接更多精彩內(nèi)容