AIDL文件
1.callBack接口:
interface ICleanDiskCallBack{
void onComplete();
}
该接口设计的目的是,当一个进程完成清理工作后,回调给另外一个进程,好让他做后面的事情。
2.服务aidl
import com.xxx.ICleanDiskCallBack;
interface IFridgeLauncher {
void cleanDisk(ICleanDiskCallBack cb);
}
该aidl为Server端实现,设计的意思是,暴露给其他的进程,调用清理的方法。
Server端实现:
IFridgeLauncher.Stub iFridgeLauncher = new IFridgeLauncher.Stub() {
@Override
public void cleanDisk(ICleanDiskCallBack cb) throws RemoteException {
iCleanDiskCallBack = cb;
}
};
Client端错误的实现,iCleanDiskCallBack 这里拿到的就会是null
Client 端错误实现:
//清理存储
FridgeLauncherHelper.getInstance().cleanDisk(new ICleanDiskCallBack() {
@Override
public void onComplete() throws RemoteException {
//清理存储之后空间还不够 那么报错
if (FileUtils.getSDAvailaleSize() < mDownloadInfo.size) {
for (TaskCB taskCB : taskCBS) {
taskCB.onDownloadError(mDownloadInfo,-1);
}
mStart =false;
}else {
download();
}
}
@Override
public IBinder asBinder() {
return null;
}
});
return;
}
download();
我们这里asBindler返回空,就会导致Server端拿不到你传递过去的CallBack.
Client 端正确实现:
//清理存储
FridgeLauncherHelper.getInstance().cleanDisk(new ICleanDiskCallBack.Stub() {
@Override
public void onComplete() throws RemoteException {
//清理存储之后空间还不够 那么报错
if (FileUtils.getSDAvailaleSize() < mDownloadInfo.size) {
for (TaskCB taskCB : taskCBS) {
taskCB.onDownloadError(mDownloadInfo,-1);
}
mStart =false;
}else {
download();
}
}
});
我们的CallBack需要实现Stub接口就可以让Server端拿到。
这个是什么原因,还需要深入了解Android Binder
参考:https://blog.csdn.net/qq_31877171/article/details/104959668