【发布时间】:2017-11-25 00:48:02
【问题描述】:
我在我的游戏控制台中看到了这些错误。有人知道如何最好地处理房间中的 OOM 错误吗?
java.lang.OutOfMemoryError:
at android.database.CursorWindow.nativeGetString (Native Method)
at android.database.CursorWindow.getString (CursorWindow.java:451)
at android.database.AbstractWindowedCursor.getString (AbstractWindowedCursor.java:51)
at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1272)
at org.walleth.data.transactions.TransactionDAO_Impl$8.compute (TransactionDAO_Impl.java:1212)
at android.arch.lifecycle.ComputableLiveData$2.run (ComputableLiveData.java:87)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
at java.lang.Thread.run (Thread.java:762)
【问题讨论】:
-
除非
String真的很大,否则房间可能不是你的问题,而只是你崩溃的地方。 OOM 有两个触发器:请求太大的内存块(想想Bitmap)或由于某处泄漏而真正内存不足。在后一种情况下,您崩溃的地方恰好是您最终耗尽内存的地方,但不一定是泄漏的地方。您是否得到了这个崩溃日志的变体,它告诉您分配失败有多大? -
不幸的是,我没有崩溃日志的变体,在那里我看到了分配失败的大小。但这可能是一个巨大的字符串(在某些情况下数据字段可能很大) - 有什么办法可以捕捉到这个 OOM 并忽略这个项目(很可能是合同部署,无论如何我对此不感兴趣)
-
您没有办法很好地捕获该特定异常,因为它发生在您无法控制的后台线程上,并且 LiveData 不会传播异常。考虑不要让你的 DAO 返回 LiveData,而是使用 RxJava 类型。或者,让这个查询在 DAO 中同步,并安排在您自己的某个后台线程上调用 @Query 方法。
-
感谢您的建议!将首先尝试使用 paging-lib:github.com/walleth/walleth/issues/110 - 也许这也是加载的事务量 - 在某些情况下可能很多。
-
再想一想,它可能对内存不足错误没有帮助,因为它会执行相同的操作,但如果查询太大,它只会更加一致。如果您要更新任何内容,它只能在查询期间出现错误的情况下帮助您提高数据准确性。这些是最麻烦的错误,因为您似乎甚至无法找到哪个查询是错误的。
标签: android out-of-memory android-room android-livedata