13

CursorAdaptersgoogle docs は、最初のコンストラクターを使用しないことを指摘しています。

CursorAdapter(Context context, Cursor c)

他に2つのオプションしかありません。

CursorAdapter(Context context, Cursor c, boolean autoRequery)

それは言う

自動再クエリを制御できるコンストラクタ。これは使用せず、代わりに CursorAdapter(Context, Cursor, int) を使用することをお勧めします。このコンストラクターを使用すると、FLAG_REGISTER_CONTENT_OBSERVER が常に設定されます。

CursorAdapter(Context context, Cursor c, int flags)`

これは、推奨されるコンストラクターであると述べています。

問題は、最後のコンストラクターで使用するフラグがFLAG_AUTO_REQUERY(int 1) とFLAG_REGISTER_CONTENT_OBSERVER(int 2) の 2 つしかないことです。バックグラウンドでの管理と更新に CursorLoader を使用しているため、使用FLAG_AUTO_REQUERYしても意味がありません。ではFLAG_REGISTER_CONTENT_OBSERVER、 を使用する場合は必要ありませんCursorLoader

今、私はCursorAdapter(Context context, Cursor c, int flags)それが私のでうまく動作するようにするためにどの整数を渡すのCursorAdapterですか? 私が心配しているのは、古いカーソルを正しく管理する方法です。これを行う正しい方法が本当にわかりません。

を使用する場合はFLAG_REGISTER_CONTENT_OBSERVER、 で何かを行う必要がありますonContentChanged()が、 で使用swapCursor()する場合LoaderManagerは、カーソルが閉じていないため、 を実行するだけで済みますadapter.swapCursor(cursor).close()onContentChanged()しかし、それはinと競合しCursorAdapterますか? 目標は、メモリ リークを発生させず、効率的にすることです。

4

1 に答える 1

19

数週間前にこのトピックについてブログを書きました... 読んでみると役立つかもしれません。開発者サイトのサンプル コードを読むことも検討してください。

LoaderManager クラスのメリットを享受する


どのコンストラクターを使用する必要がありますか?

使用CursorAdapter(Context context, Cursor c, int flags)します (ドキュメントでは、前者よりもこのコンストラクターを使用することをお勧めします)。

どの整数を渡しますかCursorAdapter(Context context, Cursor c, int flags)

整数を渡すだけ0です。あなたはそれFLAG_REGISTER_CONTENT_OBSERVERを渡したくありません.CursorLoaderCursorAdapterCursorLoaderContentObserver for you), and you definitely don't want to pass it

私が心配しているのは、古いカーソルを正しく管理する方法です。これを行う正しい方法が本当にわかりません。

の全体的なポイントはLoaderManager、面倒なカーソル管理のすべてを舞台裏で行うことです。クエリされたカーソルの管理を気にせずにデータを自動的にロードできるという便利さこそが、古いメソッドstartManagingCursorstopManagingCursorメソッドが廃止された理由です。

...私はただすることができましたadapter.swapCursor(cursor).close()

そうしないでください。はLoaderManager、カーソルを自動的に閉じます。実際、私の記憶が正しければclose()、カーソルを呼び出しようとするとエラーが発生します。onContentChanged()どちらもオーバーライドする必要はないようです。

于 2012-06-19T03:16:31.253 に答える