消息机制
主线程创建后Looper.prepare创建lopper对象,创建looper的同时或创建消息队列
messagequeue,通过ThreadLocal与当前线程绑定,并把消息队列最为成员变量,创建handler对象的时候会从当前线程中获取loopper对象的消息队列,发送消息就是往消息对象中加入新消息,looper.loop开启死循环,从消息队列中查询到消息,交给hanlder的handmessage处理,当调用mHandler.getLooper().quit()时候死循环才会终止,明白上述原理我们可以在向子线程发送消息,不过android里的handler不是另外开启线程来执行的
,还是在主UI线程中,如果想另启线程的话需要用到HandlerThread来实现。在使用HandlerThread的时候需要实现CallBack接口以重写handlerMessage方法,在handlerMessage方法中来处理自己的逻辑。下来给出一个小例子程序。
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
MyHandlerThread handlerThread = new MyHandlerThread("子线程");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper(), handlerThread);
handler.postDelayed(() -> {
Message message = handler.obtainMessage();
message.arg1 = 1;
message.sendToTarget();
}, 3000);
}
class MyHandlerThread extends HandlerThread implements Handler.Callback {
public MyHandlerThread(String name) {
super(name);
}
@Override
public boolean handleMessage(Message msg) {
//打印线程的名称
System.out.println(" handleMessage CurrentThread = " + msg.arg1 + Thread.currentThread().getName());
return false;
}
}
}
2跨进程通信
广播 aidl messenger。。。看我的另外一篇文章
end
网友评论