这几天使用kotlin写一个项目,用到handler,然后提醒提警告

This Handler class should be static or leaks might occur......I wrote that debugging code because of a couple of memory leaks I found in the Android codebase. Like you said, a Message has a reference to the Handler which, when it's inner and non-static, has a reference to the outer this (an Activity for instance.) If the Message lives in the queue for a long time, which happens fairly easily when posting a delayed message for instance, you keep a reference to the Activity and "leak" all the views and resources. It gets even worse when you obtain a Message and don't post it right away but keep it somewhere (for instance in a static structure) for later use. 

百度后才发现是handler内存泄露的问题(原谅小木子是菜鸟)
参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html
http://blog.csdn.net/donkor_/article/details/78796518?utm_source=tuicool&utm_medium=referral

原代码

    private var mHandler1: Handler = object : Handler() {        override fun handleMessage(msg: Message?) {            super.handleMessage(msg)            if (msg != null) {                when (msg.what) {                    CKey.WHAT_TWO -> {                        verify_tv_again.text = "获取验证码"                        verify_tv_time.text = ""                        verify_next.isEnabled = true                        verify_tv_again.isEnabled = true                        goToAccountInfoActivity()                    }                }            }        }    }

然后按照网站的提示,做了修改:

private class MyHandler(activity: VerifyActivityActivity) : Handler() {        private val mActivity: WeakReference = WeakReference(activity)        override fun handleMessage(msg: Message) {            if (mActivity.get() == null) {                return            }            val activity = mActivity.get()            when (msg.what) {                102 -> {                    activity!!.verify_tv_again.text = "李振华"                    activity.verify_tv_time.text = ""                    activity.verify_next.isEnabled = true                    activity.verify_tv_again.isEnabled = true//                    activity.goToAccountInfoActivity()                }                else -> {                }            }        }    }

初始化参数的时候声明一个即可使用(黄色背景即有警告 ,修改后没有了黄色警告)

    var handler12 = MyHandler(this)    handler12.sendEmptyMessage(102)

效果

大致讲解:
首先是拿到activity的弱引用 private val mActivity: WeakReference = WeakReference(activity)
然后在需要修改的view之间使用这个引用查找响应的控件做UI修改即可
activity!!.verify_tv_again.text = “李振华”
activity.verify_tv_time.text = “”
activity.verify_next.isEnabled = true
activity.verify_tv_again.isEnabled = true

!!是kotlin非空的意思然后就解除警告,详细讲解参考里面有,就不复制粘贴了,只贴了代码和效果图

更多相关文章

  1. Android(安卓)修改App中默认TextView的字体和颜色
  2. Eclipse 开发 Android, Hello, TimePicker (学习8)
  3. A20启动LUNCH选项修改
  4. Android(安卓)修改系统时间代码
  5. android p cts camera测试 android.hardware.camera2.cts.Captur
  6. Android(安卓)设置字体大小和显示大小后界面混乱
  7. Android(安卓)扫描音乐文件、两种方式获取文件最新修改时间
  8. Android修改自定义Dialog的大小
  9. Android(安卓)实现不同字体颜色的TextView实现代码

随机推荐

  1. Android(安卓)- 准备工作【仿】淘宝App
  2. Android中EditText(或TextView)中的InputTy
  3. android中根据控件宽度,实现展示文本内容,
  4. Android(安卓)uevent
  5. Android Studio(二)从Eclipse的迁移到And
  6. Android 判断某一个类是否存在任务栈里面
  7. OkHttp3.0 添加SSL证书信任
  8. 浅析安卓的启动过程
  9. android 学习笔记2——实现基本功能
  10. Android工程手动增加插件包方法