binder 双向通信时客户端没有joinThreadPool也能接收到服务端的请求

devtools/2024/9/21 9:12:38/

服务端之所以能够接收到客户端的请求,并能正确调用服务端进程中对应服务的onTransact方法,是因为服务端会通过joinThreadPool或者startThreadPool,在里面循环的等待客户端的请求并在接收到请求之后做对应的处理。
但是今天我在用C++写binder双向通信的代码时,发现,我客户端并没有调用joinThreadPool或者startThreadPool,也能接收到服务端的请求,而且能正确的调用对应的方法,这是为什么呢?理论上我客户端都没有在循环的等待服务端的数据并做处理,那这个是怎么调用到的呢?
我的代码实现是这样写的:
客户端:

service->registerCallBack(new BnCallBack());//1,先向服务端注册一个callback,即通过writeStrongBinder写入一个BBbinder对象	
service->say_hello();//2,远程调用服务端的方法//3,如果接收到回调消息,则进行处理
status_t BnCallBack::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){int ret;int32_t strict_policy = data.readInt32();switch (code) {case SUCESS_CMD: {int32_t code = data.readInt32();onSucess(code);return NO_ERROR;

服务端:

void BnHelloService::say_hello(void){int cnt = callback->onError();//回调客户端ALOGD("call say_hello : %d\n",cnt);
}

为了搞清楚客户端是如何调用到对应的方法,打印了一下调用栈

 onSucess:: #00 pc 00003635  /system/bin/test_client
04-26 10:18:46.968 10131 10131 D onSucess:: #01 pc 000035d1  /system/bin/test_client
04-26 10:18:46.968 10131 10131 D onSucess:: #02 pc 000359df  /system/lib/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+70)
04-26 10:18:46.968 10131 10131 D onSucess:: #03 pc 0003d16d  /system/lib/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+684)
04-26 10:18:46.968 10131 10131 D onSucess:: #04 pc 0003d635  /system/lib/libbinder.so (_ZN7android14IPCThreadState15waitForResponseEPNS_6ParcelEPi+224)
04-26 10:18:46.968 10131 10131 D onSucess:: #05 pc 00036589  /system/lib/libbinder.so (_ZN7android8BpBinder8transactEjRKNS_6ParcelEPS1_j+36)
04-26 10:18:46.968 10131 10131 D onSucess:: #06 pc 0000331f  /system/bin/test_client
04-26 10:18:46.968 10131 10131 D onSucess:: #07 pc 00002ded  /system/bin/test_client
04-26 10:18:46.968 10131 10131 D onSucess:: #08 pc 00016c61  /system/lib/libc.so (__libc_init+48)

可以看出是在BpBinder的transact方法中开始调用的,在transact方法中又调用waitForResponse方法。
原来在客户端远程调用say_hello方法后,就会通过waitForResponse等待服务端返回数据,而刚好,我回调的方法又是写在say_hello方法中,这就导致服务端在该方法内发出BC_TRANSACTION,那在客户端就会收到BR_TRANSACTION,进而正确的调用到对应的方法。

总结
如果服务端是在客户端的远程调用方法内又回调给客户端,这时候还是由客户端主动发起请求,是不需要添加循环等待服务端的数据的。如果是在其它的地方,服务端需要主动的发送消息给客户端,这时候,客户端依旧需要通过joinThreadPool或者startThreadPool来处理服务端的请求。


http://www.ppmy.cn/devtools/17460.html

相关文章

Linux开发板配置静态IP

1、查看网口信息,易知eth0无IP地址 ifconfig2、首先分配一个IP地址 sudo ifconfig eth0 192.168.5.8 up3、此时配置的IP地址只是临时的,当你reboot重启板子上电后,ip地址会消失,因此需要为板子配置静态ip,避免每次上…

知识点记录blog

通过请教他人或者从其他资源上看到的知识,然后随手对其进行总结,内容难免有误,欢迎指正!

IP地址 0.0.0.0 和 127.0.0.1之间的区别

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

解决:pip is configured with locations that require TLS/SSL

在使用pip进行软件包安装的时候出现问题: WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 解决方法: mkdir -p ~/.pip vim ~/.pip/pip.conf然后输入内容: [global…

深入理解Java中的核心数据结构及其实现

目录 引言 1. 数组 (Array) 2. 链表 (LinkedList) 3. 栈 (Stack) 4. 队列 (Queue) 5. 哈希表 (HashMap) 6. 树 (Tree) 和 二叉树 (Binary Tree) 结论 引言 在计算机科学中,数据结构是组织、管理和存储数据的方式,它们对算法设计与程序性能有着决…

异地多活是什么

异地多活(Geographically Distributed Active-Active)是一种技术架构,用于增强系统的可用性和容错性。它是一种分布式系统设计的策略,可以让应用程序在多个地理位置同时活动,并提供实时数据同步和故障切换能力。 主要…

黑马-设计模式-笔记(未完)

一、基础 UML类图 可见性: public- private#protected 表示方式:属性:可见性 名称:类型[默认值]方法:可见性 名称(参数)[:返回类型] 关系:关联关系:实线,引用关系,类属性里有另一个…

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述,这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式(UiAbility),样式的书写、状态管理以及动画等方面进行探讨 页面之间…