aidl接口调用的问题

此篇来Mark一下Android中的aidl接口调用中的问题:

aidl接口中的会通过回调返回一个自定义的IBinder实例;

通常我们调用时会先bindService,然后要等...之所以要等,是因为bindService之后,ServiceConnection接口中的回调onServiceConnected,总是会延时几百毫秒才会被调用到,所以,调用完bindService之后立即调用返回的IBinder实例是不行的;

有些资料中加了一个判断:binder != null,因为这个回调的延时,这个判断未必准确,为空不一定说明没有连上,同样的不为空也不一定说明连接任然有效!(因为onServiceDisconnected回调同样也会有延时)。

另外,不要在主线程中以同步的方式连接并调用IBinder实例中的方法!

这里面有很多原因,因为方法中有耗时工作导致主线程ANR只是其中一个原因;除此之外,如果你想在一个按钮事件中(或者主线程消息队列的同一消息中)同时连接(bindService)并调用IBinder实例中的方法,这是不可能成功的!(即使你注意到了连接之后有延时,并且你等待了几秒),这是因为aidl接口的回调(onServiceConnected与onServiceDisconnected)一定是在主线程中执行的,回调操作被丢到主线程的消息队列中,如果你连接之后不返回,主线程就一直被你当前的消息或者事件占用着,回调就进不来,你就不要希望能调用到IBinder实例中的任何方法,因为此时IBinder实例一直是null,你必须在连接和调用IBinder实例中的方法之间释放(不占用)主线程,让消息循环能处理消息队列中接下来的消息(回调就是其中之一)!

要避免以上这个问题,你就必须分两个事件处理,或者干脆不在主线程中连接Service。

时间: 2024-11-07 06:20:19

aidl接口调用的问题的相关文章

Android深入源码分析理解Aidl整体调用流程(雷惊风)

2017年开始上班的第一天,老不想工作了,假期感觉还没开始就已经结束了,唉,时间就是这样,新的一年开始了,虽然很不想干正事,没办法,必须干起来,因为后边的路还很长,距离六十岁还很远.刚上班也没什么事,复习一下之前的东西,看了一下Aidl相关的知识,仔细瞅了瞅Aidl的调用流程,这里写篇文章整理一下,帮助大家的同时,自己也加深一下印象.对Aidl不太了解的童鞋可以先看一下我之前的一篇文章, 链接如下:http://blog.csdn.net/liuyonglei1314/article/detai

Android Service AIDL 远程调用服务 简单音乐播放实例的实现

Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成. AIDL 是什么 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码.如果在一个进程中(例如Activi

AIDL接口写法小记

AIDL,度娘还是解释很到位的,实际就这么回事了. Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口.我们知道4个Android应用程序组件

微信公众号API测试——接口调用频率限制

接口频率限制[1] 公众号调用接口并不是无限制的.为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下,每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到如下错误返回码: {"errcode":45009,"errmsg":"api freq out of limit"} 各接口调用频率限制如下: 接口 每日限额 获取access_token 2000 自定义菜单创建 1000 自定义菜单查询 10000 自定义菜

PHP 使用 curl_* 系列函数和 curl_multi_* 系列函数进行多接口调用时的性能对比

在页面中调用的服务较多时,使用并行方式,即使用 curl_multi_* 系列函数耗时要小于 curl_* 系列函数. 测试环境 操作系统:Windows 10 x64 Server:Apache 2.4.18 PHP:5.6.19 MySQL:5.7.11 cURL:7.47.1 测试数据库选择 MySQL 官方网站的样本数据库 sakila,下载地址:http://dev.mysql.com/doc/index-other.html 测试页面需要调用 3 个 api: getActorInf

ThinkPHP整合支付宝即时到账接口调用

首先是在支付宝的蚂蚁金服开放平台下载PHP的demo: 1 https://doc.open.alipay.com/doc2/detail?treeId=62&articleId=103566&docType=1 下载地址如上,里面有个MD5加密方式UTF8的PHP的demo可以拿来用,可以直接在localhost上跑,传入合适的参数即使体验支付一次,这点和微信支付接口调用的demo相同. 现在我们尝试将其中demo的lib类文件整合到thinkphp之中去. 将四个lib改名放入Vend

短信接口调用——阿里大于API开发心得

互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短信费用是计数缴纳的,作为个人开发者,我使用的服务产生的费用为0.45¥/条(10万条以下). 现在要实现一个例会短信群发通知的功能,所有被通知对象信息均存于Mysql中,应用架构采用asp.net MVC .首先准备好获取的API各项(以下各项服务参数都需要在大于官网上申请), 申请好自己的短信签名

iOS app支付宝接口调用的一点总结(补充支付宝SDK&Demo下载地址)

由于app内需要用到支付功能,选择了当前最流行的支付宝进行支付.在进行内嵌支付宝功能开发时,被它狠狠的耍了一把. 根据支付宝开发文档,参考demo代码.将相关支付功能加到了自己的代码中.一些根据文档来做,也没有太大的难度.但添加完代码,进行测试时,问题却来了.在app中可以成功调用支付宝app,成功支付并返回.这个时候就出现问题了.在app delegate支付宝回调本app的执行函数中,公钥验证签名成功后,会对支付结果进行提示.根据demo,提示支付的代码如下: [cpp] view plai

支持APP手机应用(android和ios)接口调用 ,传输验证可用 shiro 的 MD5、SHA 等加密

请认准本正版代码,售后技术有保障,代码有持续更新.(盗版可耻,违者必究)         此为本公司团队开发 ------------------------------------------------------------------------------------------------------------------------- 1. 有 oracle .msyql.spring3.0.spring4.0  一共 4 套版本全部提供没有打jar没有加密的源代码(最下面截图2