5

当我发出多个 cursor.moveToNext() 请求时,我的程序崩溃了。错误消息如下:

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=773 (# cursors opened by this proc=773)
at android.database.CursorWindow.<init>(CursorWindow.java:112)
at android.database.CursorWindow.<init>(CursorWindow.java:100)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:364)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:209)
at net.cunniman.teacherplannerlite.SchoolClassDataSource.getClassForDayView(SchoolClassDataSource.java:173)
at net.cunniman.teacherplannerlite.DayView.getSchoolClasses(DayView.java:200)
at net.cunniman.teacherplannerlite.DayView.displayDate(DayView.java:176)
at net.cunniman.teacherplannerlite.DayView.plusDay(DayView.java:287)
at net.cunniman.teacherplannerlite.DayView.onClick(DayView.java:93)
at android.view.View.performClick(View.java:3565)
at android.view.View$PerformClick.run(View.java:14165)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4514)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
at dalvik.system.NativeStart.main(Native Method)

try {
    this.openForRead();
    for (int day_counter = 0; day_counter < DAY_PERIOD.length/2; day_counter++)
    {
        Cursor cursor = database.rawQuery
            ("SELECT " + NAME + " FROM " + TABLE_NAME + " WHERE " + DAY_PERIOD[day_counter * 2]
            + " = '" + day + "' AND " + DAY_PERIOD[day_counter * 2 + 1] + " = "
            + Integer.toString(period), null);


    while (cursor.moveToNext())
    {
        String name = cursor.getString(0);
        sc.setName(name);
    }


} finally {
    this.close();
}

有谁知道可能导致这种情况的原因 - 似乎是内存泄漏(也许?)但是有没有办法可以防止它发生?

谢谢

4

1 回答 1

8

大多数情况下,此错误的原因是未关闭的游标。确保在使用它们后关闭所有游标(即使在出现错误的情况下)。

Cursor cursor = null;
try {
    cursor = db.query(...
    // do some work with the cursor here. i.e.:
    while (cursor.moveToNext())
    { .... }
} finally {
    // this gets called even if there is an exception somewhere above
    if(cursor != null)
        cursor.close();
}
于 2013-03-20T22:40:23.387 回答