[Android] 线程间交互
学习Android的线程交互,要掌握Thread, Looper, MessageQueue和Handler这四个概念。
1. Thread代表线程,不是每个Thread都有Looper,但Looper必须附在一个线程上。
2. Looper内部维护一个MessageQueue,即消息队列。
3. 每个MessageQueue中有一个Handler,Handler对象用来发送消息到MessageQueue中,或接收Looper(从MessageQueue中)送来的消息。
获取Looper对象的引用:
Looper looper = Looper.myLooper();
为了与Looper进行沟通,我们需要构建一个Handler的子类,这里我们将其命名为EventHandler。
EventHandler负责MessageQueue的存取工作。
籍由EventHandler,我们可以发送消息给Looper,然后放入其MessageQueue中。
class EventHandler extends Handler { public EventHandler(Looper looper) { super(looper); } @override public void handleMessage(Message msg) { // 处理收到的Message textView.setText((String) msg.obj); } }
发送一个message:
EventHandler handler = new EventHandler(looper); handler.removeMessages(); // 清除MessageQueue中的事件 String str = "Hello, message."; Message msg = handler.obtainMessage(1, 1, 1, str); // 组装一个事件 handler.sendMessage(msg); // 发送事件
在别的线程里,若要向主线程发送Message,可用如下方法获取主线程的Looper对象引用:
Looper mainLooper = Looper.getMainLooper(); // 接下来获取Handler,发送Message的代码和之前一样