Несколько CursorLoader - PullRequest
       1

Несколько CursorLoader

2 голосов
/ 30 ноября 2011

Я расширяю свой предыдущий вопрос, я решаю эту проблему, но у меня появляется новая похожая ошибка.

У меня следующая активность

public class ActivityMatchesList extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListView lvLive = (ListView)findViewById(R.id.matchListList);
        lvLive.setOnItemClickListener(OnItemClickListenerLive);
        getSupportLoaderManager().initLoader(1, null, this);
        getSupportLoaderManager().initLoader(2, null, this);
        getSupportLoaderManager().initLoader(3, null, this);
    }

    private OnItemClickListener OnItemClickListenerLive = new OnItemClickListener(){
        Intent i = new Intent(ActivityMatchesList.this, ActivityEvents.class);
        finish();
        startActivity(i); 
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { //FIXME: add switch for 3 loader
        switch (id){
        case 1:
            CursorLoader cursorLoaderLive = new CursorLoader(this, uri1,null,null,null,null);
            return cursorLoaderLive;
        case 2:
            CursorLoader cursorLoaderRankingLeague = new CursorLoader(this, uri1,null,null,null,null);
            return cursorLoaderRankingLeague;
        case 3:
            CursorLoader cursorLoaderRankingLive = new CursorLoader(this, uri1,null,null,null,null);
            return cursorLoaderRankingLive;
        default:
            return null;
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        switch (loader.getId()){
        case 1:
            Adapter1.swapCursor(cursor);
            break;
        case 2:
            Adapter2.swapCursor(cursor);
            break;
        case 3:
            Adapter3.swapCursor(cursor);
            break;
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        switch (loader.getId()){
        case 1:
            Adapter1.swapCursor(null);
            break;
        case 2:
            Adapter2.swapCursor(null);
            break;
        case 3:
            Adapter3.swapCursor(null);
            break;
        }
    }
}

С OnItemClickListener я завершаю () это действие и начинаю новое, когда я заканчиваю новое, чтобы вернуться к этому, иногда у меня появляется следующая ошибка

11-30 09:35:01.839: INFO/dalvikvm(321): Uncaught exception thrown by finalizer (will be discarded):
11-30 09:35:01.848: INFO/dalvikvm(321): Ljava/lang/IllegalStateException;: Finalizing cursor android.database.sqlite.SQLiteCursor@43c6ab00 on MAIN_TABLE that has not been deactivated or closed
11-30 09:35:01.848: INFO/dalvikvm(321):     at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)
11-30 09:35:01.848: INFO/dalvikvm(321):     at dalvik.system.NativeStart.run(Native Method)

Я не могу выяснить причину, кто-то может мне помочь?

edit: Проблема сохраняется, если я использую только 1 загрузчик. Похоже, что при завершении действия загрузчик иногда не закрывает курсор, почему?

1 Ответ

0 голосов
/ 14 января 2012
  1. Почему вы звоните finish() в этом упражнении, прежде чем начинать новое? Android управляет жизненным циклом активности. Если это потому, что вы не хотите возвращаться к этому занятию после завершения следующего, рассмотрите noHistory .

  2. Ошибка, которую вы опубликовали, означает, что есть открытый курсор, который должен быть закрыт. Если вы видите ошибку, когда заканчиваете новое действие, мне кажется, это указывает на то, что ошибка в новом действии, а не в этом. Возможно, вам придется позвонить Cursor.close () до завершения нового действия (возможно, в onPause() или onDestroy()).

Мой ответ на ваш предыдущий вопрос также может быть полезен: https://stackoverflow.com/a/8857179/399105

...