基于Kotlin解决Android中Handler内存泄漏问题

作为Android开发者,我们都知道,当我们在子线程处理完耗时任务后刷新UI时,一般会借助于 `Handler` 来实现。关于handler具体用法这里不做说明了,在使用 `Handler` 时一般会遇到内存泄漏的隐患,同时编译器也会给出一大片黄色的警告,在两者驱使下,我们势必要对其暴露的问题进行合理解决。

​ 关于Handler内存泄漏原因的详细分析可以参考该文章:https://www.jianshu.com/p/f2f186e3dd3e

这里我们主要来看一下在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。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,519评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,539评论 25 709
  • 【Android Handler 消息机制】 前言 在Android开发中,我们都知道不能在主线程中执行耗时的任务...
    Rtia阅读 10,397评论 1 28
  • DAY38:我与有书两周年的故事 #遇见你,是最美丽的意外。# 昨天,“双十二”,是有书两周年的生日。祝有书两周年...
    书香是佳阅读 2,383评论 0 2
  • 六岁那年,他抓住了那只蝉,便以为转抓了整个夏天。 十六岁那年,他吻过她的脸,便以为能和他到永远。 是不是一个人过久...
    胡里胡屠阅读 1,256评论 0 0

友情链接更多精彩内容