Окно курсора не может быть создано из связующего
1 Cursor cursor = contentResolver.query(MY_URI, new String[] { "first" }, null, null, null);
2 if (cursor != null) {
3 if (cursor.moveToFirst()) {
4 first = cursor.getString(cursor.getColumnIndex("first"));
5 cursor.close();
6 }
7 }
Затем в строке # 3 (согласно журналам) я время от времени сталкиваюсь с этим исключением (выдержка ниже):
android.database.CursorWindowAllocationException: Cursor window could not be created from binder.
at android.database.CursorWindow.<init>(CursorWindow.java:134)
at android.database.CursorWindow.<init>(CursorWindow.java:41)
at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:709)
at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:707)
at android.database.CursorWindow.newFromParcel(CursorWindow.java:718)
at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:196)
...
Любые идеи, почему он выбрасывает это исключение? Спасибо!
Ответы
Ответ 1
Я подозреваю, что ошибка может быть связана с тем, что вы не закрываете свои курсоры должным образом все время. Попробуйте:
1 Cursor cursor = contentResolver.query(MY_URI, new String[] { "first" }, null, null, null);
2 if (cursor != null) {
3 if (cursor.moveToFirst()) {
4 first = cursor.getString(cursor.getColumnIndex("first"));
5 }
6 cursor.close(); ///// Changed here
7 }
Курсор всегда должен быть закрыт (независимо от того, является ли его пустым). Убедитесь, что все остальное приложение также делает это.
Ответ 2
Попробуйте этот способ:
if (cursor != null) {
cursor.moveToFirst();
do {
first = cursor.getString(cursor.getColumnIndex("first"));
}while(cursor.moveToNext());
}
Ответ 3
Попробуйте другой поток
new Thread(new Runnable(){ public void run(){
...here all code
}});
. Но исходные коды Android SDK выглядят как 4.0.2_r1
130 закрытый CursorWindow (Parcel источник) {
131 mStartPos = source. readInt();
132 mWindowPtr = nativeCreateFromParcel (источник);
133 if (mWindowPtr == 0) {
134 throw new CursorWindowAllocationException ( "Окно курсора не может быть"
135 +" создан из связующего. ");
136}
137 mName = nativeGetName (mWindowPtr);
138 mCloseGuard.open( "закрыть" );
139}
где mWIndowPtr - Int