service和activity通信方式
service与activity之前的通信方式有很多,回调接口方式、观察者模式、广播、还有handler等
handler的post和send的区别
(1)post一类的方法发送的是Runnable对象,但是最后还是会被封装成Message对象,将Runnable对象赋值给Message对象中的callback字段,然后交由sendMessageAtTime()方法发送出去。
在处理消息时,会在dispatchMessage()方法里首先被handleCallback(msg)方法执行,实际上就是执行Message对象里面的Runnable对象的run方法。
(2)sendMessage一类方法发送的消息直接是Message对象,处理消息时,在dispatchMessage里优先级会低于handleCallback(msg)方法,是通过自己重写的handleMessage(msg)方法执行。
注意 handler的post方法不一定是开启了子线程去执行代码逻辑的。
new Runnable() 依附于创建Handler的线程,即若创建Handler的线程是主线程,则runnable也就需要在主线程执行;若创建Handler的线程是子线程,则runnable也就需要在子线程执行。
在子线程中执行:
Log.e("TAG",Thread.currentThread().getId()+"");
HandlerThread handlerThread = new HandlerThread("handlerThread");
handlerThread.start();
Handler mHandler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.e("TAG","receive sendMessage");
}
};
mHandler.post(new Runnable() {
@Override
public void run() {
Log.e("TAG",Thread.currentThread().getId()+"");
}
});
执行结果:注意 所有post 的Runnable线程都在同一个子线程中,
在主线程中执行:
Log.e("TAG",Thread.currentThread().getId()+"");
Handler mHandler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
Log.e("TAG","receive sendMessage");
}
};
mHandler.post(new Runnable() {
@Override
public void run() {
Log.e("TAG",Thread.currentThread().getId()+"");
}
});
测试结果: