前言
在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); } }
参考文章
《
© 版权声明