前言

AIDL通信时,涉及到了序列化反序列化过程,会出现注册的对象和解注册的对象并不是同一对象的情况。

这个是之前遇到的,忘记备注了,今天有空就摘抄于此,方便自己查阅和学习。

正文

比如注册监听时

private CopyOnWriteArrayList<IMusicCallbackInterface> mCallbackList;

@Override
public void addCallback(IMusicCallbackInterface callback) {
    mCallbackList.add(callback);
}

@Override
public void removeCallback(IMusicCallbackInterface callback) {
    //error
    if(mCallbackList.contains(callback)){
        mCallbackList.remove(callback);
    }
}

上面中

//error
if(mCallbackList.contains(callback)){
    mCallbackList.remove(callback);
}

上面方式是无法正确移除callback的。

原因就在于我们的注册对象listener是在进程间传输的,Binder在服务端会把客户端传递过来的对象重新转换为新的对象,因而注册和解注册的根本就不是一个对象。它们在内存中的地址是不同的。

解决方式。

for( IMusicCallbackInterface iMusicCallbackInterface1: mCallbackList){
    if(iMusicCallbackInterface1.asBinder() == callback.asBinder()){
        mCallbackList.remove(callback);
    }
}

参考文章

  1. Android AIDL通信之注册和解注册监听器

相关文章

暂无评论

none
暂无评论...