子线程可以使用message来传递信息给主线程,主线程是实时接收的消息队列。
了解几个概念:
UI线程:就是我们的主线程,系统在创建UI线程的时候会初始化一个Looper对象,同时也会创建一个与其关联的MessageQueue。如果执行一个超过5秒的未完成的任务,程序将弹出dailog窗口显示无响应,强制关闭。
Handler:负责消息的发送与接收并处理。如果希望Handler正常工作,在当前线程中要有一个Looper对象。
Message:Handler接收与处理的消息对象。此对象有 4个成员变量:arg1和arg2是整型, what用户定义的消息代码, obj接收任意类型的对象。
MessageQueue:消息队列,用来存放通过Handler发布的消息,按照先进先出管理Message,在初始化Looper对象时会创建一个与之关联的MessageQueue。
Looper:每个线程只能够有一个Looper,管理MessageQueue,Looper会死循环取出Message Queue的非Null Message传递给Handler并设置此Message为Null。Main线程会自动创建Looper,子线程不会自动创建Looper,需要手动创建。
首先创建一个子线程,并用message向主线程发送消息
class MyThread extends Thread {
Handler handler;
@Override
public void run() {
super.run();
int count = 100;
while (count > 1) {
try {
Thread.sleep(3000); //睡眠3秒
Message message = new Message();
message.what=0;
handler.sendMessage(message)
// switch (sign){
// case SIGN_ZERO:
// message.what=SIGN_ZERO;
// handler.sendMessage(message);
// break;
// case SIGN_ONE:
// message.what=SIGN_ONE;
// handler.sendMessage(message);
// break;
// case SIGN_TWO:
// message.what=SIGN_TWO;
// handler.sendMessage(message);
// break;
// default:
// break;
// }
} catch (InterruptedException e) {
e.printStackTrace();
}
// Intent intent = new Intent("com.lishun");
// MainActivity.this.sendBroadcast(intent);
}
}
}
同时开启线程,并用handle接收message,这是写在主线程中的方法,一般写在initView中。
MyThread myThread = new MyThread();
myThread.start(); //启动线程
handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) { //handleMessage方法实时获得message
super.handleMessage(msg);
//接收message
switch (msg.what){
case SIGN_ZERO:
tx_search.setText("COPY"); //更新UI
Log.d(TAG, "handleMessage: "+msg.what);
break;
case SIGN_ONE:
tx_search.setText("正在copy");
Log.d(TAG, "handleMessage: "+msg.what);
break;
case SIGN_TWO:
tx_search.setText("copy完成");
Log.d(TAG, "handleMessage: "+msg.what);
Toast.makeText(MainActivity.this, "U盘已拔出", Toast.LENGTH_SHORT).show();
sign=SIGN_ZERO;
break;
default:
break;
}
}
};