Android之解决aidl里面函数参数太大不能跨进程通信的问题
来源:互联网 发布:电脑cpu评测软件 编辑:程序博客网 时间:2024/05/19 18:47
问题:
因为做的截屏拍照是跨进程通信的,所以需要用aidl,但是参数传递用的byte[] image,网上查了下aidl传递的基本参数类型,没有byte[], 然后把图片转化成String,结果时候接受得到有时候接受不到,不知道什么原因,然后其它传递参数又可以与服务端通信,后来推测,应该是aidl传递参数大小有限制。
分析:1、不能把图片转成字符串,即使能传过去,也不行。
2、参数传递太大了。
3、可用序列化。
4、先把图片保存到本地,然后传图片的路径。
aidl中支持的参数类型为:基本类型(int,long,char,boolean等),String,CharSequence,List,Map,其他类型必须使用import导入,即使它们可能在同一个包里,比如上面的Student,尽管它和IMyService在同一个包中,但是还是需要显示的import进来。
1.bus工程实现通过service实现aidl实体类
2.actor工程通过发起bindservice,根据action去启动远程(跨进程的)bus上的aidl。
那么问题来了,我们知道,linux系统进程间通信,各个进程间资源是隔离的,两个进程间需要通信,就要把msg转换成底层os系统能够识别的数据单元,在Android里面的方案是aidl+parcelbal的序列化。
为了模拟和测试aidl的性能问题,我做了个简单实验,在Android中,进程间通信通过binder实现,bind是通信的数据载体,当序列化后的数据单元过大时,就会出问题,报出android.os.TransactionTooLargeException。
http://developer.android.com/reference/android/os/TransactionTooLargeException.html
官方文档里有说明,最大通常限制为1M.也就是说如果大于1M数据的话,就应该分开传。理论上说,应该都是对象和字符串类型的数据为主,只要不是大图片实体等问题,一般应该够用。
我这边做了一个测试,序列化传送了450k的String被序列化 后的数据,耗时使用了33秒的时间。
try {StringBuilder sb = new StringBuilder();for(int i = 0;i< 30;i++){sb.append(new String (stringMsg));}System.out.println( "actor time start :" + System.currentTimeMillis());binder.sendMsg("msg from actor : " + sb.toString());} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}------public static BusCore coreBinder = new BusCore.Stub() {@Overridepublic void sendMsg(String msg) throws RemoteException {Log.d("", " RemoteBusCoreService msg:" + msg);System.out.println("buscore time end :" + System.currentTimeMillis());}};
对于远程服务,必须调用 bindService()方法,而不是 startService()方法。
0 0
- Android之解决aidl里面函数参数太大不能跨进程通信的问题
- Android 跨进程通信之:AIDL
- android之AIDL跨进程通信详解
- Android跨进程通信之AIDL
- Android跨进程通信-AIDL的使用
- 跨进程通信之AIDL
- Android跨进程通信-AIDL
- Android跨进程通信-AIDL
- Android AIDL跨进程通信
- Android AIDL跨进程通信
- Android 跨进程通信: AIDL
- Android:AIDL跨进程通信
- 【Android学习之路】使用AIDL进行跨进程通信
- Android中跨进程通信方式之使用AIDL
- android 实现aidl跨进程通信之二
- Android跨进程通信之AIDL快速入门
- 【Android API】Android跨进程通信AIDL的使用方法
- AIDL跨进程通信在Android的应用
- linux中的awk
- linux中的sed
- 第11周 —— 教师兼干部类
- SM2算法第八篇:SSL Socket通信详解
- VS2010安装MSDN(转载)
- Android之解决aidl里面函数参数太大不能跨进程通信的问题
- Sublime Text2插件之 - JSON格式化
- Python模拟登陆
- 华中农业大学第四届程序设计大赛网络同步赛 Arithmetic Sequence
- spring——控制反转简单例子
- 第十一周项目——Time类中的运算符重载
- cv::Mat& dst 这名话从语法是怎么理解?
- js中使用for 循环和 for in 遍历数组区别
- OpenGL ES Shader相关API 总结【5】——VBO与VAO的作用与关系