我有一个 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 TRANSACTION
当ArrayList
达到大约 700 个对象。
当前解决方案(感觉有点hacky)
我正在拆分 ArrayList
成 block 并发送几个Messages
回到Handler
然后将其重建为一个 ArrayList
然后在 App 中使用(更新 RecyclerViews 等)。
我使用这种方法是因为性能得到了显着提高——只需要在第一次启动应用程序/服务时进行初始查询,而不是总是查询 Content Provider
每次打开应用程序。
我说“hacky”的原因是因为这感觉像是对 Binder Framework
限制的解决方法而不是解决方案。
我们欢迎任何关于以不同方式处理此问题的建议。
最佳答案
我想到的两个选择是:
在您的服务中有一个静态 ArrayList,并在接收到光标时向 Activity 发送一个广播,以将服务中的静态 Arraylist 的内容复制到 Activity 中的本地数组列表中。通过这种方式,Activity 仅在复制内容时才引用静态数组列表。
我会将内容异步保存在 sql 数据库中,然后将广播发送到 Activity 以再次从数据库中异步检索游标。然后我会在 UI 线程上调用适配器上的 notifydatasetChanged。
关于安卓异常: FAILED BINDER TRANSACTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183634/