Android异常:绑定器事务失败

Android异常:绑定器事务失败,android,android-binder,Android,Android Binder,我有一个服务,它在我的应用程序启动时在后台运行,并在应用程序关闭后继续运行。它为从内容提供商注册的Uri实现加载程序。OnLoadCompleteListener。当一个新的游标对象通过回调方法onLoadComplete(Loader-Loader,Cursor-data)传递时,我使用游标运行一个异步任务,创建一个自定义对象的数组列表,这些对象实现了可打包的接口。一旦处理完毕,如果应用程序打开,它会使用处理程序和信使、消息和捆绑包,通过IPC框架向应用程序发回编组/解编组信息。如果应用程序未

我有一个
服务
,它在我的应用程序启动时在后台运行,并在应用程序关闭后继续运行。它
为从
内容提供商注册的
Uri
实现
加载程序。OnLoadCompleteListener
。当一个新的
游标
对象通过回调方法
onLoadComplete(Loader-Loader,Cursor-data)
传递时,我使用
游标
运行一个
异步任务
,创建一个
自定义
对象的
数组列表
,这些对象实现了
可打包的
接口
。一旦处理完毕,如果应用程序打开,它会使用
处理程序
信使
消息
捆绑包
,通过IPC框架向应用程序发回编组/解编组信息。如果应用程序未打开,则一旦打开,
ArrayList
就可以发送回应用程序,该应用程序在打开时调用
服务

问题:

ArrayList
可能会变得相对较大(它不包含
bitmap
,只包含
Primitives
和几个短
String
对象),其绝对数量意味着当
ArrayList
达到大约700个对象时,它会命中
失败的活页夹事务

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

我正在将
ArrayList
拆分成块,并将多条
消息
发送回
处理程序
,然后将其重构为一个
ArrayList
,然后在应用程序中使用(更新RecyclerViews等)

我使用这种方法是因为性能得到了显著提高-只需要在首次启动应用程序/服务时进行初始查询,而不是每次打开应用程序时都要查询
内容提供商

我之所以说“hacky”,是因为这感觉像是对
Binder框架的限制的一种变通方法,而不是一种解决方案


任何关于以不同方式处理此问题的建议都将受到欢迎。

我想到的两个备选方案是:

  • 在服务中具有静态ArrayList,并在接收到光标时向活动发送广播,以将服务中的静态ArrayList的内容复制到活动中的本地ArrayList中。通过这种方式,“活动”仅在复制内容时引用静态Aarray列表

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


  • 谢谢你的回复,这两个想法都很有道理。我确实想过使用静态ArrayList,但由于作用域的原因,我尽量避免使用静态变量,在本例中,我访问了一个全局变量,其他线程可以同时尝试访问和修改该全局变量。我可能会使用Sql数据库,或者重新开始使用完全不同的方法。我也会使用第二种方法。我同意你的观察。如果我们能得到另一个我也感兴趣的答案,那将很有趣。我已经决定采取不同的方法-我将使用自定义AsyncTaskLoader-如果实现正确,这将提供我所追求的稳定性。在这个实例中使用数据库就像是将一个进程加倍—查询一个内容提供者,然后将数据插入到我自己的数据库就像是将一个进程加倍,因为我只需要再次查询数据库并创建自定义POJO对象即可。