【问题标题】:Cursor window allocation of 2048 kb failed with rxjava adapter on room2048 kb 的光标窗口分配失败,房间上有 rxjava 适配器
【发布时间】:2018-01-24 13:17:25
【问题描述】:

我在我的应用程序中使用带有 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 和 3rd 方库(在迁移期间我没有更改)。

我检查了 Room 生成的代码,它似乎都正确关闭了游标。

关于发生了什么以及如何调试此崩溃有什么想法吗?

【问题讨论】:

  • 我也设置了StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().build());,并且在日志中没有看到任何异常。
  • 我看到了同样的问题。你找到解决办法了吗?

标签: android sqlite rx-java2 android-room


【解决方案1】:

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

【讨论】:

  • 嘿,我遇到了类似的问题,但使用 LiveData - 没有使用 RX。有关解决此问题的任何想法或建议?
猜你喜欢
  • 2012-07-05
  • 2013-11-16
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多