我有一个Service
在我的应用启动时在后台运行,并在应用关闭后继续运行。来自implements
的已注册Loader.OnLoadCompleteListener<Cursor>
Uri
Content Provider
。在回调方法Cursor
上投放新的onLoadComplete(Loader<Cursor> loader, Cursor data)
对象后,我使用AsyncTask
运行Cursor
来创建ArrayList
自定义Objects
实现Parcelable
interface
的方法。处理完毕后,如果应用程序处于打开状态,它会使用带有Handler
,Messenger
和Messages
的{{1}}使用IPC框架发送回应用程序进行编组/解组。如果应用程序未打开,则Bundle
准备好在打开后发送回应用程序,打开时会调用ArrayList
。
问题:
Service
可能会相对较大(它不包含ArrayList
,只包含Bitmaps
和几个短Primitives
个对象),而且数量绝对意味着它会点击当String
获得大约700个对象时FAILED BINDER TRANSACTION
。
当前的解决方案(感觉有点hacky)
我将ArrayList
拆分成块并将几个ArrayList
发送回Messages
,然后将其重建为一个Handler
,然后在App中使用(更新) RecyclerViews等。)。
我使用这种方法,因为性能得到了显着改善 - 只需要在第一次启动App / Service时进行初始查询,而不是每次打开应用程序时始终查询ArrayList
。
我之所以说“hacky&#39;是因为这感觉就像限制Content Provider
而不是解决方案的解决方法。
任何有关采取不同措施的建议都会受到欢迎。
答案 0 :(得分:1)
我想到的两个选择是:
在您的服务中有一个静态ArrayList,并在光标接收到Activity时发送广播,以复制活动内局部arraylist中服务内部的静态Arraylist的内容。通过这种方式,只有复制内容时,Activity才会引用静态aarraylist。
我会异步保存sql数据库中的内容,然后向活动发送广播,以再次从数据库中异步检索游标。在UI线程上,我会在适配器上调用notifydatasetChanged。