一、解决线程间通信的问题:异步消息处理机制:
第一种情况:匿名内部类实现接口,直接在主线程中复写run()方法;
1、在主线程方法外创建Handler类的对象,利用匿名类的形式,并复写其handleMessage()方法;
2、在主线程中开启新的线程,在新的线程里,利用Message对象,携带处理后的信息,用handler对象调用其sendMessage()方法,将Message对象发送出去;
new Thread(new Runnable(){
@Override
public void run() {
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
Log.d("---->", "wowoowowoowowo");
}
}).start();
3、在复写的handleMessage()方法中,根据返回消息的结果进行相应的处理;
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
Log.d("------>", "handler外");
switch (msg.what) {
case UPDATE_TEXT:
Log.d("------>", "handler内");
text.setText("Nice to meet you");
Toast.makeText(getApplicationContext(),"hahaha", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
第二种情况:新建一个MyThread类,实现Runnable接口,然后再复写run()方法;
public class MyThread implements Runnable{
@Override
public void run() {
Message message = new Message();
message.what = MainActivity.UPDATE_TEXTTWO;
MainActivity.handler.sendMessage(message);
}
}
在主线程中,handler应改为静态,而在复写的handleMessage()方法中,涉及到的控件对象,也应改为静态,因为hanler为静态:
private static TextView text; //此处控件对象为静态,才能在静态的handler中使用;
protected static Handler handler = newHandler(){
public voidhandleMessage(Message msg) {
switch (msg.what) {
case UPDATE_TEXT:
text.setText("Nice tomeet you");
break;
case UPDATE_TEXTTWO:
text.setText("Nice tomeet ps");
break;
default:
break;
}
}
};