作為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。