作為Android開發(fā)者昨凡,我們都知道澳窑,當(dāng)我們在子線程處理完耗時任務(wù)后刷新UI時作谭,一般會借助于 `Handler` 來實現(xiàn)鳄虱。關(guān)于handler具體用法這里不做說明了办成,在使用 `Handler` 時一般會遇到內(nèi)存泄漏的隱患赦政,同時編譯器也會給出一大片黃色的警告,在兩者驅(qū)使下泳叠,我們勢必要對其暴露的問題進行合理解決冗美。
? 關(guān)于Handler內(nèi)存泄漏原因的詳細分析可以參考該文章:http://www.reibang.com/p/f2f186e3dd3e。
這里我們主要來看一下在kotlin語言下如何處理handler內(nèi)存泄漏問題析二。一般地,我們都會借助于靜態(tài)內(nèi)部類與弱引用來處理這類問題节预,kotlin中也不例外叶摄,這里以在fragment中為例,來看看實現(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糠赦。