Handler主线程子线程之间的互相通信
package com.wyl.dansnote; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class SecActivity extends Activity implements OnClickListener{
Button btn_main_to_work;
Button btn_work_to_main;
Handler handler;
Handler handler_main_to_work;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sec_main);
initViews();
initMainHandler();//子线程向主线程发送消息
new MainToWorkThread().start();//主线程向子线程发送消息
initClicks();
} private void initMainHandler() {
handler = new MainHandler();
}
class MainHandler extends Handler{
@Override
public void handleMessage(Message msg) {
String msg_rtn = (String)msg.obj;
// System.out.print("MainHandler.handleMessage():"+msg_rtn+",当前线程:"+Thread.currentThread().getName());
Toast.makeText(SecActivity.this, "MainHandler.handleMessage():"+msg_rtn+",当前线程:"+Thread.currentThread().getName(), 100).show();
}
}
//子线程向主线程发送消息
class WorktoMainThread extends Thread{
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.obj = "我是模拟的网络数据";
handler.sendMessage(msg);
System.out.println("开始发送网络数据:");
//暂时还不清楚为什么这个线程里使用Toast的时候一定要加上Looper.prepare(),否则就报错
// Looper.prepare();
// Toast.makeText(SecActivity.this, Thread.currentThread().getName()+"开始发送网络数据:", 100).show();
}
} class MainToWorkThread extends Thread{
@Override
public void run() {
Looper.prepare();
handler_main_to_work = new Handler(){
@Override
public void handleMessage(Message msg) {
String msg_get = (String)msg.obj;
// handler_main_to_work.sendMessage(msg);
Toast.makeText(SecActivity.this, Thread.currentThread().getName()+",MaintoWorkHandler.handleMessage()开始接收消息:"+msg_get, 100).show();
}
};
Message msg = handler_main_to_work.obtainMessage();
String msg_get = (String) msg.obj;
System.out.println("MainToWorkThread获取到的消息:"+msg_get);
Looper.loop();
}
} private void initClicks() {
btn_main_to_work.setOnClickListener(this);
btn_work_to_main.setOnClickListener(this);
} private void initViews() {
btn_main_to_work = (Button) findViewById(R.id.id_btn_w_to_main);
btn_work_to_main = (Button) findViewById(R.id.id_btn_main_to_w);
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.id_btn_w_to_main:
new WorktoMainThread().start();
break;
case R.id.id_btn_main_to_w:
Message msg = handler_main_to_work.obtainMessage();
msg.obj = "我是点击的时候发送给子线程的消息";
handler_main_to_work.sendMessage(msg);
break;
default:
break;
}
}
}