在做FWK时,经常用到RemoteCallbackList,是线程与线程之间交流的的重要工具,他的主要作用就是把多个callback保存到列表里,在合适的时机同时回调,也可以防止重复的调用相同的任务,只保证你需要的一个结果回调。
还有一个值得注意的就是,通过aidl,我们可以实现client(后称客户端)和server(服务端)的双向通信,有时候server和client处于不同的进程当中,如果client意外退出,server再向client发送消息的话,就有可能导致server端也退出,这个时候安卓提供了 RemoteCallbackList 来为我们隐式解决了这种问题。
网上写原理的很多,我这个只记录怎么使用的,gogogo~~~
1、先定义一个AIDL,ICarInfoCallBack.aidl如下:
// ICarInfoCallBack.aidl
package com.test.libsvcarinfo;
interface ICarInfoCallBack {
void onCanChangeEvent(int value);
}
2、我这里只写了一些如何使用RemoteCallbackList,至于AIDL中如何调用,还需要自己去学学AIDL使用。
public class Test {
//初始化
public RemoteCallbackList<ICarInfoCallBack> listeners = new RemoteCallbackList<>();
//注册接口方法
public void registerCarInfoCallBack(ICarInfoCallBack callback) {
//向RemoteCallbackList里面注册ICarInfoCallBack接口
listeners.register(callback);
}
//取消注册接口的方法
public void unRegisterCarInfoCallBack(ICarInfoCallBack callback) {
//向RemoteCallbackList里面取消注册ICarInfoCallBack接口
listeners.unregister(callback);
}
//调用此方法回调
private void onReceiveData(int value) {
//获取listeners长度,看看有多少个注册接口
int len = listeners.beginBroadcast();
for (int i = 0; i < len; i++) {
//从listeners取出第i个ICarInfoCallBack
ICarInfoCallBack carInfoCallBack = listeners.getBroadcastItem(i);
//回调方法
carInfoCallBack.onCanChangeEvent(value);
}
listeners.finishBroadcast();
}
}
|