handler+message机制有四种情况:
1)handler在主线程 使用主线程looper 和 消息队列 在子线程中发送message到消息队列
2)handler在主线程 使用主线程looper 和 消息队列 在主线程中发送message到消息队列
3)handler在主线程,使用子线程的looper和消息队列 在主线程中发送message到消息队列
4)handler在子线 ,使用子线程的looper和消息队列 ,在主线中发送message消息队列
前两种情况比较简单我就不讲了,我们讲讲后面两种不常见的用法
第三种情况:
package com.example.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = (TextView) findViewById(R.id.tv_love);
// 创建一个子线程的looper和消息队列
HandlerThread myLooperThread = new HandlerThread("my looper thread");
myLooperThread.start();
// 拿到子线程的轮询器Looper
Looper looper = myLooperThread.getLooper();
/**
* 此时,主线程和子线程各有一个Messagequeue和Loop而轮询器; 主线程的是系统自己创建的子线程是我们创建的
*/
// 创建Handler对象,要显示指定Handler对象向哪个轮询器/消息队列发送消息
final MyHandler myHandler = new MyHandler(looper);
//点击发送消息
tv_text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tv_text.setText("歼灭来犯之敌");
myHandler.sendEmptyMessage(1);
}
});
}
class MyHandler extends Handler {
// public MyHandler() {
// super();
// }
// 我们使用指定的轮询器,默认的是主线程的轮询器
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
// tv_text.setText("呜呜呜呜");
Log.i("zhang_xin", "我是子线程,在处理主线程发送的消息:敌人太强大,打不过了,我投降!");
super.handleMessage(msg);
}
}
}
第四种情况
package com.example.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv_text;
private Handler myHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = (TextView) findViewById(R.id.tv_love);
new MyThread().start();
while(myHandler==null){
//如果myHandler=null,则等待子线程创建Handler对象
}
myHandler.sendMessage(Message.obtain());
}
class MyThread extends Thread {
@Override
public void run() {
Looper.prepare();
myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.i("zhang_xin", "收到主线程发来的消息");
}
};
Looper.loop();
}
}
}
注意Looper.prepare()和Looper.loop()两句代码