1. 程式人生 > >基於Kotlin解決Android中Handler記憶體洩漏問題

基於Kotlin解決Android中Handler記憶體洩漏問題

作為Android開發者,我們都知道,當我們在子執行緒處理完耗時任務後重新整理UI時,一般會藉助於 Handler 來實現。關於handler具體用法這裡不做說明了,在使用 Handler 時一般會遇到記憶體洩漏的隱患,同時編譯器也會給出一大片黃色的警告,在兩者驅使下,我們勢必要對其暴露的問題進行合理解決。

這裡我們主要來看一下在kotlin語言下如何處理handler記憶體洩漏問題。一般地,我們都會藉助於靜態內部類與弱引用來處理這類問題,kotlin中也不例外,這裡以在fragment中為例,來看看實現程式碼吧:

private var handler: Handler = WithoutLeakHandler(this)

companion object {
        const val GET_LOCAL_VIDEOS: Int = 100
        /**
         * by moosphon on 2018/09/16
         * desc: 解決handler記憶體洩漏的問題,訊息的處理需要放在內部類的{@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", "掃描本地視訊的數量為->"+videoData?.size)
            val message= Message()
            message.what = GET_LOCAL_VIDEOS
            handler.sendMessage(message)
        }).start()
    

在kotlin中,我們需要在靜態類 WithoutLeakHandler 中重寫 handleMessage 方法,並在裡面處理訊息和重新整理UI。