游标 window 2048 kb 的分配因房间上的 rxjava 适配器而失败
Cursor window allocation of 2048 kb failed with rxjava adapter on room
我在我的应用程序中使用 RxJava2 版本 1.0.0 的 Room。以前我使用的是 Realm,一切都很好。现在,当我在 Room 上迁移时,我会遇到类似堆栈跟踪的随机罕见崩溃:
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 和第 3 方库(我在迁移过程中没有更改)。
我检查了 Room 生成的代码,它似乎都正确关闭了 Cursors。
关于发生了什么以及如何调试此崩溃有什么想法吗?
事实证明,问题出在 RxJava 的 .subscribeOn(Schedulers.io())
for Flowable responses in RxJava Room adapter 中。显然它正在启动线程,但从未释放过它们。
我已经在固定线程池上交换了 Schedulers.io()
最多 20 个线程,它确实消失了。
我在我的应用程序中使用 RxJava2 版本 1.0.0 的 Room。以前我使用的是 Realm,一切都很好。现在,当我在 Room 上迁移时,我会遇到类似堆栈跟踪的随机罕见崩溃:
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 和第 3 方库(我在迁移过程中没有更改)。
我检查了 Room 生成的代码,它似乎都正确关闭了 Cursors。
关于发生了什么以及如何调试此崩溃有什么想法吗?
事实证明,问题出在 RxJava 的 .subscribeOn(Schedulers.io())
for Flowable responses in RxJava Room adapter 中。显然它正在启动线程,但从未释放过它们。
我已经在固定线程池上交换了 Schedulers.io()
最多 20 个线程,它确实消失了。