AIDL之注册和解注册监听器

Android2023年6月3日 am8:10发布1年前 (2023)更新 3XCN.COM站长
0 0 0
广告也精彩
目录

前言

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通信之注册和解注册监听器

 历史上的今天

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站文章: 部分来源于网络,仅供站长学习和参考,若侵权请留言
广告也精彩

相关文章

广告也精彩

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...

网站升级中

公告

近期网站升级中,可能存在一些bug。欢迎反馈 https://www.91es.com/we.html

本站域名

本站域名 : 91es.com3xcn.com。本站邮箱 : 站长邮箱 i@oorr.cn,通知邮箱we@oorr.cn ,如有更新,请看公告 。