11

データベースからデータをクエリするために、アプリケーションにローダーを実装しました。リスナーを実装することで、発生する変更をリッスンしますLoaderCallbacks<Cursor>。私が抱えている問題はonLoaderReset(Loader<Cursor> loader)、データが変更され、ローダーに関連付けられているデータを無効にして解放したいときにメソッドを使用するときです。すべての例で、このメソッドには次の呼び出しがあります。

mAdapter.swapCursor(null);

しかし、問題は、カーソルからのデータをアダプターで使用するのではなく、アプリケーションで別の方法で使用することです。

onLoadFinished(Loader<Cursor> loader, Cursor data)(たとえば、返されたカーソルから直接)

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

            if (data.moveToFirst()) {
                TOTAL_CARDS = data.getCount();
                mView.createCards(TOTAL_CARDS);
            } else {
                TOTAL_CARDS = 0;
                mView.createCards(TOTAL_CARDS);
            }


        }

ここで対応することは何でしょうか。それは と似ていmAdapter.swapCursorます。私はローダーの経験があまりありません。実際、ローダーを使い始めたばかりなので、誰かがこれに対する解決策を持っていれば、それを感謝します。どうも!

編集:今のところ、ローダーにnullを渡していますが、次のように機能します:

@Override
public void onLoaderReset(Loader<Cursor> loader) {
        loader = null;
}

};

しかし、これは正しい解決策ですか?

4

1 に答える 1

27

やっている

@Override
public void onLoaderReset(Loader<Cursor> loader) {
  loader = null;
}

何もしないのと同じです。コード例では、メソッドの引数へのローカル参照をnullにしているだけです。ただし、この参照は、メソッド呼び出しの復帰後に常に削除されます。(トピックの詳細については、Is Java "pass-by-reference" or "pass-by-value"?を参照してください。)

このonLoaderReset(Loader)メソッドは、ローダーのコールバック (通常はActivityまたはFragmentインスタンス) が、以前Cursorに取得したへのすべての参照を解放するように要求されたときに呼び出されますonLoadFinished(Loader, Cursor)。基本的に、このメソッドは、以前に提供されLoaderたものをすぐに閉じるため、クリーンアップするように求めますCursor。カーソルが閉じられると、それによってデータを取得できなくなります。ただし、カーソルが閉じられた後も(通常は a によってCursorAdapter)使用されている場合、これにより例外がスローされます。

同様に、メソッドが返された後、以前に提供されたオブジェクトを使用してはならないことonLoadFinished(Loader, Cursor)を求める暗黙の契約があります。Cursor代わりに、これらの参照をメソッド引数として提供される新しいカーソルに置き換える必要があります。対照的に、onLoaderReset(Loader)は同じ契約を履行するように求めますが、代替を提供することはありません。つまり、以前に取得した へのすべての参照を削除する必要がありますCursor

あなたの例ではCursor、メソッドのスコープをエスケープさせませんが、代わりにデータをすぐに読み取っています。Cursorしたがって、経由で提供されたオブジェクトへの参照は存在しないため、削除する必要はありonLoadFinished(Loader, Cursor)ません。したがって、インターフェイス コントラクトを満たすための の空の実装はonLoaderReset(Loader)、その仕事をしてくれます。

于 2013-05-02T11:52:53.973 に答える