Handler、Looper、Message、MessageQueue的使用

来源:互联网 发布:天猫魔盒好用软件 编辑:程序博客网 时间:2024/05/21 09:58

1 Handler

Handler消息处理对象,主要用于发送和处理消息。Handler将需要发送的消息封装成Message,使用obtainMessage()得到Message的实例,通过调用sendMessage()将消息发送给Looper,然后Looper将消息存放到MessageQueue中,当Looper发现MessageQueue中包含有Message时就将其广播出去,处理消息的Handler收到广播后,通过handleMessage()处理消息。

2 MessageQueue

MessageQueue 消息队列,用于存放消息。通常一个线程只有一个MessageQueue,并且MessageQueue不会自动创建,而是通过Looper进行管理,主线程在创建时,会创建一个默认的Looper对象,随着Looper对象的创建,会自动创建一个MessageQueue的实例,而非主线程中,通过prepare()方法创建Looper。

3 Meeeage

Message 消息,存放在MessageQueue中的对象,一个MessageQueue中可以存放多个Message对象,通常使用Message中的静态方法obtain()获取到Message的实例,在通过obtain()方法获取Message时,首先检查Message Pool是否包含有所创建的Message的实例,如果有则直接从Message Pool取出,如果没有则新建。同时可以通过Handler的obtainMessage()获取到Message的实例。

4 Looper

Looper MessageQueue的管理者,每一个MessageQueue不可能脱离Looper而存在。使用prepare函数进行Looper的创建。每一个Looper与一个线程相关联,通过Looper.myLooper()获取当前线程操作的Looper对象。创建Looper对象时,会默认的创建一个MessageQueue对象。在系统中除了主线程有Looper对象以外,其他线程不含有Looper对象,所以不能接收Message。如果需要接收Message对象,则需要创建一个Looper对象,此时线程就具有了Looper与MessageQueue数据结构了。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。

public class MainActivity extends Activity {
private TextView txtMessage;
private Button btnSend;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.txtMessage = (TextView) findViewById(R.id.txtMessage);
this.btnSend = (Button) findViewById(R.id.btnSend);
new SendThread().start();
this.btnSend.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {
//获取到主线程的Looper对象
//Looper looper = Looper.getMainLooper();
//使用主线程的Looper创建了Handler对象,所以当使用Handler发送消息时,
//handler = new CustomHandler(looper);

//Message message = handler.obtainMessage(1, "Message");
//handler.sendMessage(message);
//new SendThread().start();
Message message = handler.obtainMessage(1, "Main Thread Message.");
handler.sendMessage(message);
}
});
}

class CustomHandler extends Handler {


public CustomHandler(Looper looper) {
super(looper);
}


@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
txtMessage.setText(msg.obj.toString());
}

}
class SendThread extends Thread {


@Override
public void run() {
// Looper looper = Looper.getMainLooper(); //获取到主线程的Looper对象
// handler = new CustomHandler(looper);
// Message msg = handler.obtainMessage(1, "Message");
// handler.sendMessage(msg);

Looper.prepare();
handler = new ThreadHandler(Looper.myLooper());
Looper.loop();
}


class ThreadHandler extends Handler {


public ThreadHandler(Looper looper) {
super(looper);
}


@Override
public void handleMessage(Message msg) {

handler = new CustomHandler(Looper.getMainLooper());
Message message = handler.obtainMessage(1, "子线程");
handler.sendMessage(message);
}

}
}

原创粉丝点击