Android例外:FAILED BINDER TRANSACTION

时间:2016-03-23 16:27:51

标签: android android-binder

我有一个Service在我的应用启动时在后台运行,并在应用关闭后继续运行。来自implements的已注册Loader.OnLoadCompleteListener<Cursor> Uri Content Provider。在回调方法Cursor上投放新的onLoadComplete(Loader<Cursor> loader, Cursor data)对象后,我使用AsyncTask运行Cursor来创建ArrayList自定义Objects实现Parcelable interface的方法。处理完毕后,如果应用程序处于打开状态,它会使用带有HandlerMessengerMessages的{​​{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而不是解决方案的解决方法。

任何有关采取不同措施的建议都会受到欢迎。

1 个答案:

答案 0 :(得分:1)

我想到的两个选择是:

  1. 在您的服务中有一个静态ArrayList,并在光标接收到Activity时发送广播,以复制活动内局部arraylist中服务内部的静态Arraylist的内容。通过这种方式,只有复制内容时,Activity才会引用静态aarraylist。

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