GreenDaoマルチスレッドクエリによるOOM異常の解決
1、java.lang.OutOfMemoryError: Failed to allocate a 56 byte allocation with 32 free bytes and 32B until OOM
2、java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
主にこの2つのタイプのOOMで、最初はGreenDaoが漏れるとは思わなかったので、先に記録してなるべく避けましょう!
3、GreenDaoはクエリーをカプセル化し、cursorの生成とクローズはAbstractDaoで行われているので、マルチスレッド操作時にメモリが漏れる可能性があります.この質問は面接で聞かれました!4、AbstractDao.queryRaw()はキャッシュに関係なく、queryBuilderメソッドではキャッシュデータが使用されます.
5、So、できる
自分でcursorで解決することもできます
GreenDaoが出会ったいくつかの穴の参考文章
2、java.lang.OutOfMemoryError: OutOfMemoryError thrown while trying to throw OutOfMemoryError; no stack available
主にこの2つのタイプのOOMで、最初はGreenDaoが漏れるとは思わなかったので、先に記録してなるべく避けましょう!
3、GreenDaoはクエリーをカプセル化し、cursorの生成とクローズはAbstractDaoで行われているので、マルチスレッド操作時にメモリが漏れる可能性があります.この質問は面接で聞かれました!4、AbstractDao.queryRaw()はキャッシュに関係なく、queryBuilderメソッドではキャッシュデータが使用されます.
5、So、できる
/** A raw-style query where you can pass any WHERE clause and arguments. */
public List queryRaw(String where, String... selectionArg) {
Cursor cursor = db.rawQuery(statements.getSelectAll() + where, selectionArg);
return loadAllAndCloseCursor(cursor);
}
自分でcursorで解決することもできます
cursor = GreenDaoHelper.getDaoSession().getDatabase()
.rawQuery(sql, new String[]{String.valueOf(startTime)});
GreenDaoが出会ったいくつかの穴の参考文章