Android IPC 中抛出的异常 TransactionTooLargeException
程序员文章站
2022-04-15 14:05:57
...
1. 背景
项目中用到 aidl 通信,在客户端使用aidl 向 服务端 无限发送数据通信时 会抛出TransactionTooLargeException
Process: com.snbc.cabinetclient, PID: 22854
io.reactivex.exceptions.OnErrorNotImplementedException
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
at io.reactivex.internal.subscribers.LambdaSubscriber.onError(LambdaSubscriber.java:76)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.checkTerminated(FlowableObserveOn.java:207)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:392)
at io.reactivex.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)
Caused by: android.os.TransactionTooLargeException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:496)
at com.包名.IAIDLChannel$Stub$Proxy.call(IAIDLChannel.java:83)
at 包名.persenter.Main_Sort_Presenter$2.subscribe(Main_Sort_Presenter.java:34)
at io.reactivex.internal.operators.flowable.FlowableCreate.subscribeActual(FlowableCreate.java:72)
at io.reactivex.Flowable.sub
2. 问题出现原因
一个跨进程调用,调用的参数和返回值是要转换成 Parcel 对象进行传递的,而这些 Parcel 对象是存储在 Binder transaction buffer 里面的,如果参数或者返回值过大,导致这个 buffer 放不下的话,程序就会失败并且抛出 TransactionTooLargeException 异常。
Binder transaction buffer 每个应用程序只对应一个,当所有的远程调用的参数或者这些调用返回值的大小加起来超过 1Mb 的话就会抛出 TransactionTooLargeException 异常,所以当buffer 快达到极限值时即使是 startActivity 或 dialog.show()都有可能抛出此异常;
总而言之,客户端发送数据太快,远端服务响应不过来了
3. 问题解决
通信频率小一点,数据发送小一点
还不能解决你的问题的话,看看这个 点击这里