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、できる
    /** 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が出会ったいくつかの穴の参考文章