handler 只是一个消息发送和接受者,一个handler中只能包含一个Loop对象,主线程的handler中进行拿去数据的时候,他依然在UI线程中,所以在主线程中不能进行耗时的操作,而每一个handler都需要和线程相绑定,handler进行消息发送的时候一般情况都是发送给自己,而后面会学习handler将消息发送给别的looper对象,loop对象中有一个消息队列,handler就是在这个消息对列中进行消息的获取,下面是我实现的在主线程中将信息传递给子线程:
main:
public class MainActivity extends Activity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.hello);
MyThread myThread = new MyThread();
myThread.start();
<span style="white-space:pre"> </span>//这里让主线程休眠1秒,是为了让子线程的run方法先运行,如果没有的话,下面的handler就是一个null ,会报空指针/<span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>异常,
try {
myThread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message message = new Message();
message.arg1 = 1000000;
myThread.handler.sendMessage(message);
}
Mythread :
public class MyThread extends Thread {
Handler handler;
@Override
public void run() {
Looper.prepare();//这是创建一个Looper对象
Log.e("test ", " thread ");
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("test"," " + msg.arg1 + " this si thread ");
}
};
Looper.loop();//打开循环消息队列,在这里给说明一下,这里的实现是一个死循环
}
}
这是执行结果: