1. 如何将 WorkerThread 运行结果反馈回MainThread,并在View中输出给用户?
a. 在MainThread中创建Handler对象,并重载 handleMessage(Message msg) 处理方法;
b. 在WorkerThread中使用MainThread中创建的 Handler对象进行消息发送和MainThread进行通信;
public class MainActivity extends Activity
{
private TextView textView;
private Button button;
// 消息处理对象
private Handler handler;
@Override
public void onCreate(...) {
textView = (TextView)findViewById(R.id.textView1);
button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(...) {
// 创建一个WorkerThread,并执行该Thread
NetworkThread nwThread = new NetworkThread();
nwThread.start();
}
});
// 在主线程中声明一个消息处理对象Handler
handler = new Handler() {
// 重载消息处理方法,用于接收和处理WorkerThread发送的消息
@Override
public void handleMessage(Message msg) {
String msg = (String)msg.obj;
// 将WorkerThread发送的消息内容显示在TextView中
textView.setText(msg);
}
};
}
/**
* 内部WorkerThread类:NetworkThread
*/
class NetworkThread extends Thread {
@Override
public void run() {
// 模拟请求网络获取一个数据
String str = "我来自网络的数据";
// 使用主线程Handler对象创建一个消息体
Message msg = handler.obtainMessage();
msg.obj = str;
// 发送消息,WorkerThread 向 MainThread 发送消息
handler.sendMessage(msg);
}
}
}
2. 如何在MainThread中发送消息给WorkerThread进行处理?
a. 在WorkerThread中准备Looper(Looper.prepare());
b. 在WorkerThread中创建Handler对象,并重载 handleMessage(Message msg) 方法;
c. 在WorkerThread中调用 Looper.loop();
d. 在MainThread中使用WorkerThread创建的Handler对象进行发送消息;
public class MainActivity extends Activity
{
private Button button;
// 消息处理对象
private Handler handler;
@Override
public void onCreate(...)
{
button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
public void onClick(...) {
String str = "WorkerThread收到请回答";
// 使用WorkerThread创建的Handler对象创建一个消息体
Message msg = handler.obtainMessage();
msg.obj = str;
// 发送消息,MainThread 向 WorkerThread 发送消息
handler.sendMessage(msg);
}
});
// 立刻创建一个WorkerThread,并执行该Thread
NetworkThread nwThread = new NetworkThread();
nwThread.start();
}
/**
* 内部WorkerThread类:NetworkThread
*/
class NetworkThread extends Thread {
@Override
public void run() {
//1. 准备Looper
Looper.prepare();
//2. WorkerThread中创建一个消息处理对象Handler
handler = new Handler() {
// 重载消息处理方法,用于接收和处理WorkerThread发送的消息
@Override
public void handleMessage(Message msg) {
System.out.println("WorkerThread收到消息!");
}
};
//3. 调用Looper.loop()方法,从消息队列中不断获取消息,然后调用该消息对象的Handler对象的handleMessage(Message msg)进行处理
// 如果消息队列中没有消息,则Looper线程阻塞等待
Looper.loop();
}
}
}
以上就是 MainThread 和 WorkerThread 进行相互通信的方式。