安卓异常: FAILED BINDER TRANSACTION

标签 android android-binder

我有一个 Service它在我的应用程序启动时在后台运行,并在应用程序关闭后继续运行。它implements一个Loader.OnLoadCompleteListener<Cursor>对于注册 Uri来自Content Provider .当一个新的 Cursor对象在回调方法上传递 onLoadComplete(Loader<Cursor> loader, Cursor data)然后我运行 AsyncTask使用 Cursor创建一个 ArrayList定制Objects实现 Parcelable interface .处理后,如果应用程序打开,它会使用 IPC 框架发送回应用程序,使用 Handler 进行编码/解码。与 Messenger , Messages和一个 Bundle .如果应用程序未打开,则 ArrayList准备好在打开后发送回应用程序,调用 Service打开时。

问题:

ArrayList可以变得相对较大(它不包含 Bitmaps ,仅包含 Primitives 和几个短的 String 对象)并且绝对数量意味着它达到了 FAILED BINDER TRANSACTIONArrayList达到大约 700 个对象。

当前解决方案(感觉有点hacky)

我正在拆分 ArrayList成 block 并发送几个Messages回到Handler然后将其重建为一个 ArrayList然后在 App 中使用(更新 RecyclerViews 等)。

我使用这种方法是因为性能得到了显着提高——只需要在第一次启动应用程序/服务时进行初始查询,而不是总是查询 Content Provider每次打开应用程序。

我说“hacky”的原因是因为这感觉像是对 Binder Framework 限制的解决方法而不是解决方案。

我们欢迎任何关于以不同方式处理此问题的建议。

最佳答案

我想到的两个选择是:

  1. 在您的服务中有一个静态 ArrayList,并在接收到光标时向 Activity 发送一个广播,以将服务中的静态 Arraylist 的内容复制到 Activity 中的本地数组列表中。通过这种方式,Activity 仅在复制内容时才引用静态数组列表。

  2. 我会将内容异步保存在 sql 数据库中,然后将广播发送到 Activity 以再次从数据库中异步检索游标。然后我会在 UI 线程上调用适配器上的 notifydatasetChanged。

关于安卓异常: FAILED BINDER TRANSACTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183634/

相关文章:

Android Activity 不显示

java - 无法解析符号activity_sign_up

jupyter-notebook - 如何共享 Jupyter Notebook?

android - 绑定(bind)来自不同 APK 的服务

Android系统对Binder Tokens的使用

android - 如何修复 Kotlin Multiplatform Mobile gradle 红色错误

android - Ubuntu 18.04 React Native 运行 Android javax.net.ssl.SSLException

android - 远程服务如何向绑定(bind)的 Activity 发送消息?

android - 如何在 PreviewView 准备好时获取 CameraX 事件

java - 远程服务拒绝权限 onBind