Handler机制使用时候一些问题记录
Handler在哪个线程创建的,那么该线程创建Handler时候实现的HandleMessage()就会收到数据Handler.sendMessage()发出的数据。由此达到线程通讯的目的
用法:1假设在主线程中new Handler把,在子线程中Handler.sendMessage(),那么主线程接收到到消息之后就可以对相应的UI进行更新,解决了子线程无法更新UI的问题
用法:2假设在线程A创建Handler(必须在Run()方法内创建的才算是子线程的,不然该Hanlder算UI线程的),将Handler传递到B线程使用,那么可以达到子线程通信的目的
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue,所以不需要Looper.prepare(); 和Looper.loop()方法;
5)当在子线程创建Handler前,必须先调用Looper.prepare()这个方法会创建一个MessageQueue(new Handler时系统赋值给),不然在创建Handler会报Can't create handler inside thread that has not called异常
在sendMessage()后得调用Looper.loop()方法让MessageQueue循环起来,才能接收到消息
6)调用prepare和loop后的activity内部线程,在onDestory中没有调用该线程的quit方法会导致内存泄露,所以需要调用handler.getLooper().quit(); 或者是sendMessage(null)来结束循环,避免内存泄漏
几个关键的方法:
Handler.post(Runnable) 用来回到Handler所在线程执行Runnable里面的代码,也就是可以操作UI
Handler.obtainMessage(what,obj)获取一个Message对象
Handler.sendMessage(Message)发送到消息队列
Message.sendToTarget()发送到消息队列