Strcit模式表示不是封闭资源,但确实如此

时间:2017-01-15 06:25:29

标签: android sqlite memory-leaks

为了填充回收者视图,调用以下方法来获取所有order

public ArrayList<Order> getAll(){
    ArrayList<Order> items = new ArrayList<>();
    Cursor cursor = getDatabase().getReadableDatabase()
            .rawQuery("select * from " + OrderEntry.TABLE_NAME ,null);
    if (cursor.moveToFirst()) {
        while (cursor.isAfterLast() == false) {
            Order item;
            item = cursorToItem(cursor);
            items.add(item);

            cursor.moveToNext();
        }
    }
    cursor.close();
    getDatabase().close();
    return items;
}

我正在以严格模式运行我的应用程序并测试和使用真实设备(荣誉4c)。如果我注释掉有光标的行(从if之前的行到if之后的行),代码不会给出任何错误。这是我现在得到的错误:

01-15 09:47:10.667 15301-15309/com.example.myapp E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
                                                              java.lang.Throwable: Explicit termination method 'close' not called
                                                                  at dalvik.system.CloseGuard.open(CloseGuard.java:180)
                                                                  at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:830)
                                                                  at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:811)
                                                                  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
                                                                  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:649)
                                                                  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:235)
                                                                  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:199)
                                                                  at com.example.myapp.Data.Storage.OrderDbHelper.getAll(OrderDbHelper.java:70)
                                                                  at com.example.myapp.Data.Order.getAll(Order.java:171)
                                                                  at com.example.myapp.ReceiptsActivity.onResume(ReceiptsActivity.java:57)
                                                                  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1266)
                                                                  at android.app.Activity.performResume(Activity.java:6446)
                                                                  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3122)
                                                                  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3163)
                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2509)
                                                                  at android.app.ActivityThread.access$900(ActivityThread.java:165)
                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368)
                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                  at android.os.Looper.loop(Looper.java:150)
                                                                  at android.app.ActivityThread.main(ActivityThread.java:5546)
                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

我正在关闭光标,出了什么问题?

1 个答案:

答案 0 :(得分:1)

您没有关闭getReadableDatabase()返回的数据库对象。 getDatabase()作用于另一个对象,或者其他一些函数重新使用它并忘记关闭它。