在房间里使用rxjava适配器,2048 kb的光标窗口分配失败

时间:2018-01-24 13:17:26

标签: android sqlite rx-java2 android-room

我在我的应用程序中使用带有RxJava2版本1.0.0的Room。以前我使用的是Realm,一切都很好。现在,当我在Room I上迁移时,我会得到类似堆栈跟踪的随机罕见崩溃:

Fatal Exception: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. 
       at android.database.CursorWindow.<init>(CursorWindow.java:109)
       at android.database.CursorWindow.<init>(CursorWindow.java:100)
       at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
       at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:301)
       at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:139)
       at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
       at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:197)
       at android.database.AbstractCursor.moveToNext(AbstractCursor.java:245)
       at android.arch.persistence.room.InvalidationTracker.run(InvalidationTracker.java:372)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
       at java.lang.Thread.run(Thread.java:841)

有时甚至没有房间提及。我没有直接使用任何游标,只通过Room和第三方库(我在迁移过程中没有改变)。

我已经检查了Room生成的代码,这一切似乎都正确地关闭了游标。

有关正在发生的事情以及我如何调试此崩溃的任何想法?

1 个答案:

答案 0 :(得分:1)

事实证明,问题出现在RxJava的.subscribeOn(Schedulers.io())中,用于RxJava Room适配器中的Flowable响应。显然它是启动线程但从未发布过它们。 我已经在最多20个线程的固定线程池上交换了Schedulers.io(),它确实消失了。