Представление списка Android с помощью приложения-адаптера simplecursor (не отображается ANR)

1

У меня есть странная проблема с listview, при использовании адаптера simplecursor. Вот ошибка

08-31 21:50:14.540: INFO/dalvikvm(12195): Uncaught exception thrown by finalizer (will be discarded):
08-31 21:50:14.540: INFO/dalvikvm(12195): java.lang.IllegalStateException: Binder has been finalized!
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.os.BinderProxy.transact(Native Method)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.database.BulkCursorProxy.close(BulkCursorNative.java:289)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.database.BulkCursorToCursorAdaptor.close(BulkCursorToCursorAdaptor.java:141)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.database.CursorWrapper.close(CursorWrapper.java:43)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.content.ContentResolver$CursorWrapperInner.close(ContentResolver.java:1575)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at android.content.ContentResolver$CursorWrapperInner.finalize(ContentResolver.java:1586)
08-31 21:50:14.540: INFO/dalvikvm(12195):     at dalvik.system.NativeStart.run(Native Method)

У меня есть runQueryOnBackgroundThread, реализованный в моем курсореAdapter, который вызывается вызовом метода Filter.filter из действия. Поэтому у меня нет ссылки на курсор в моей деятельности. Каждый раз, когда я спрашиваю, я понимаю, что я получаю курсор измененного обратного вызова в моем адаптере курсора, который расширяет SimpleCursorAdapter

Вот как выглядит

public void changeCursor(Cursor cursor) {
        Log.d(TAG, "Cursor changed ... **************** "+ cursor);
        if (cursor != null) {
            setLoading(false);
        }
        super.changeCursor(cursor);
        initSectionHeaders(cursor);
        notifyDataSetChanged();
    }

runQueryOnBackgroundThread() просто возвращает курсор из запроса.

Я что-то упускаю, если курсор будет закрыт или управляться где-нибудь? Любая помощь по выводам очень поможет. Спасибо заранее.

** ОБНОВЛЕНИЕ ** Фрагменты моего адаптера

public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
        Log.d(TAG, "runQueryOnBackgroundThread "+ constraint);
        if (getFilterQueryProvider() != null) {
            return getFilterQueryProvider().runQuery(constraint);
        }
        return doQuery(constraint, People.CONTENT_URI);
    }

private Cursor doQuery(CharSequence constraint, Uri queryUri){
        StringBuilder selectionStrBuilder = new StringBuilder();
        String selectionArgs[] = null;
        String selection = null;

        if(constraint!=null){
            //ADDING GLOB so that the sql query can interpret linux style wildcards
            selectionStrBuilder.append("(UPPER(").append(People.DISPLAY_NAME).append(") GLOB ?)");

            selection = selectionStrBuilder.toString();
            String constraintStr = constraint.toString().toUpperCase();

            //prepend and append '*' - TODO improve
            constraintStr = "*"+ constraintStr;
            constraintStr +="*";

            selectionArgs = new String[]{constraintStr};
        }
        ContentResolver contentRes = context.getContentResolver();
        return contentRes.query(queryUri, null, selection, selectionArgs, People.DISPLAY_NAME);
    }

Кроме этих двух функций, у меня есть changeCursor, переопределенный как опубликовано ранее, и используйте курсор в представлении bind для получения данных. Я не закрываю и не изменяю свойства курсора в другом месте.

Моя функция getQuery моего оператора выглядит как

SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);

        // Tell the cursor what uri to watch,
        // so it knows when its source data changes
        c.setNotificationUri(getContext().getContentResolver(), uri);
        return c;

UPDATE2 *

Когда я запускаю ту же программу на эмуляторе, я получаю эту трассировку стека, которая сильно отличается от того, что я вижу на планшете.

01-03 17:21:44.130: ERROR/IMemory(9328): binder=0x3891a0 transaction failed fd=-2147483647, size=0, err=-2147483646 (Unknown error: 2147483646)
01-03 17:21:44.130: ERROR/IMemory(9328): cannot dup fd=-2147483647, size=0, err=-2147483646 (Bad file number)
01-03 17:21:44.130: ERROR/IMemory(9328): cannot map BpMemoryHeap (binder=0x3891a0), size=0, fd=-1 (Bad file number)
01-03 17:21:44.130: WARN/dalvikvm(9328): JNI WARNING: JNI method called with exception raised
01-03 17:21:44.130: WARN/dalvikvm(9328):              in Ldalvik/system/NativeStart;.run ()V (CallStaticVoidMethodV)
01-03 17:21:44.130: WARN/dalvikvm(9328): Pending exception is:
01-03 17:21:44.130: INFO/dalvikvm(9328): Ljava/lang/RuntimeException;: No memory in memObj
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.database.CursorWindow.native_init(Native Method)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.database.CursorWindow.<init>(CursorWindow.java:518)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.database.CursorWindow.<init>(CursorWindow.java:27)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:493)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:491)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:103)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at android.os.Binder.execTransact(Binder.java:320)
01-03 17:21:44.130: INFO/dalvikvm(9328):     at dalvik.system.NativeStart.run(Native Method)
01-03 17:21:44.130: INFO/dalvikvm(9328): "Binder Thread #3" prio=5 tid=9 NATIVE
01-03 17:21:44.130: INFO/dalvikvm(9328):   | group="main" sCount=0 dsCount=0 obj=0x405de828 self=0x8e288
01-03 17:21:44.130: INFO/dalvikvm(9328):   | sysTid=9336 nice=0 sched=0/0 cgrp=[fopen-error:24] handle=959480
01-03 17:21:44.130: INFO/dalvikvm(9328):   at dalvik.system.NativeStart.run(Native Method)
01-03 17:21:44.130: ERROR/dalvikvm(9328): VM aborting

И сбой приложения.

Я нашел отчет об ошибке по этому вопросу здесь

У кого-то была такая же проблема? Любая помощь будет оценена по достоинству. Спасибо

  • 0
    Просто напоминание. Это не ANR, а сбой приложения
  • 0
    Вы можете опубликовать свой адаптер?
Показать ещё 4 комментария
Теги:
listview
simplecursoradapter

1 ответ

1
Лучший ответ

А, наконец, нашел soln к этой проблеме. Просто что-то курсор в какой-то другой части рамки был открыт. Работает при закрытии.

  • 0
    Вы имеете в виду курсор, открытый структурой? Или открыл себя? Я сталкиваюсь с той же проблемой. Я использовал startManagingCursor, чтобы закрыть курсор. Что-то не так с этим?
  • 0
    Это потому, что курсор, который я открыл, не был закрыт.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню