基於Kotlin解決Android中Handler記憶體洩漏問題
阿新 • • 發佈:2019-01-25
作為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。