Skip to content

Handler

DawnSpring edited this page Jan 8, 2021 · 18 revisions

参考: https://blog.csdn.net/qq_37321098/article/details/81535449 https://blog.csdn.net/androidsj/article/details/79865091

  1. handler用法 发送消息and接收消息,具体用法
//传递的data 
var bundle = Bundle()  
bundle.putString("msg","我可以")

//send data 
private lateinit var handler:Handler  
var message = handler.obtainMessage()
message.data = bundle
message.what = 0x11
handler.sendMessage(message)

//receive data
**handler = @SuppressLint("HandlerLeak")**
object :Handler(){
    override fun handleMessage(msg: Message){
        super.handleMessage(msg)
        if (msg.what == 0x11){
        }
    }
}

代码里有句提示: handler = @SuppressLint("HandlerLeak")
表示代码不规范,有内存泄漏的风险,原因:
Handler在Android中用于消息的发送和异步处理,Handler常作为匿名内部类来定义,此时Handler会隐式的持有外部类对象的引用,当外部类关闭时,由于handler持有外部类的引用造成外部类无法被GC回收,这样容易造成内存泄漏;
解决方法
将其定义成一个静态内部类(此时不会持有外部类对象的引用),在构造方法中传入外部类,并对外部类对象增加一个弱引用,外部类关闭后,即使异步消息未处理完毕,外部类也能被GC回收,从而避免内存泄漏。

Clone this wiki locally