6

アプリケーションにデータベース アクセスを実装するために、Lars Vogel のチュートリアルに従いましたが、いくつかの点で非常に混乱しています...

  1. 呼び出しが行われるたびにfetchTodo、新しいカーソルが作成されて返されます。ガベージ コレクターの前のカーソルを残します。それで、私が使用しない場合startManagingCursor、またはそのことについては、カーソルでCursorLoadera を呼び出す必要がありますか?.close()もちろん範囲外fetchTodo、例:

    カーソル cursor = mNotesAdapter.fetchTodo(); // 何かをする... cursor.close();

私はこのカーソルを使い果たし、次のフェッチで新しいカーソルが作成されます。このように閉じる必要がありますか、それともガベージ コレクターに残す必要がありますか? 私はまったく異なる2つのことについて話していると思いますが... ポイントは、上記の例のように閉じる必要がありますか?

  1. Cursorメソッドも.deactivate()あり、ドキュメントには、(アクティブカーソルよりも)使用するリソースが少ないと書かれています。いつこれを使用する必要がありますか?たとえば、私のアプリでは、ListActivityを介して入力される がありSimpleCursorAdapterます (このコードの初期化は 1 回だけ呼び出されます)。使用されているカーソルはクラス メンバー変数です。これは、リストにデータを入力するメソッドの外でカーソルが必要だからです。データベースから何かが削除されたときにデータベースを再クエリするために必要です。しかし、レコードが削除されるまで、これはユーザー アクションであり、発生するまでに時間がかかる場合があります。その間、カーソルを無効にする必要がありますか? もう一度呼び出すと、.requery()再びアクティブになるからです。または、SimpleCursorAdapterカーソルがアクティブでないために動作を停止しますか?

編集:deactivate()これをテストしたところ、カーソルアダプターをセットアップした後に呼び出すことができないことがわかりました。カーソルがアクティブでない場合、リストは空になるため、ListActivity が表示されている限り、カーソルをアクティブにしておく必要があります。結局、それをStartManagingCursor処理するだけです。または新しいCursorLoader

  1. startManagingCursor/が非推奨であることはわかっていstopManagingCursorますが、(少なくとも当面は) Honeycomb をターゲットにしておらずCursorLoader、今のところ新しいものを扱いたくありません。しかし、上記のチュートリアルでstartManagingCursorは、どこでも使用されていますが、stopManagingCursor一度も呼び出されていません。なぜだめですか?Androidは独自の方法でそれを処理しますか? 私が電話すべき状況はありますstopManagingCursorか?
4

1 に答える 1

9

編集:更新された質問1を反映するように回答を更新しました:

1) fetchTodo が呼び出されるたびに、新しいカーソルが作成されて返されます。ガベージ コレクターの前のカーソルを残します。そのため、startManagingCursor や CursorLoader を使用しない場合、使い終わったらカーソルで .close() を呼び出す必要がありますか?

はい、間違いなく Android に を指示するか、 /startManagingCursor()を使用するか、自分で使用する必要があります。そうしないとメモリ リークが発生します。GC の背後にはネイティブ リソースがあるため(データベースへのファイル ハンドルなど)、GC は役に立ちません。LoaderManagerCursorLoaderclose()Cursor

2) Cursor には .deactive() メソッドもあり、ドキュメントによると (アクティブ カーソルよりも) 使用するリソースが少ないとのことです。いつこれを使用する必要がありますか?...

他の読者への編集:OPは答えを見つけて、彼の質問に投稿しました。以下は依然として保持されます。

私は使用したことがありませんdeactivate()( はありませんdeactive())。他の誰かがこれを説明できるかもしれません。本当に簡単な再クエリ/更新が必要な場合は、フレームワークをチェックしてください-これは Honeycomb だけではありません: Android 1.6 までLoaderManager使用できるLoaderManager(および) 互換ライブラリを使用します。Fragments記述するコードが少なくなるだけでなく、Android にこれらのものを完全にオフロードしますstartManagingCursor()。.

EDIT2:いくつかの注意事項LoaderManager

developer.android.comにチュートリアルがありますがLoaderManager、これらは非常に複雑で、そこにあるほとんどのチュートリアルのように初めて理解するのは困難です。これまでに見つけた最高のオールインワン ストップはhttp://mobile.tutsplus.com/tutorials/android/android-sdk_loading-data_cursorloader/です(さらに、すべての javadocs と compat lib ソースあなたが見つけることができます) --- 動作する方法は、Android に「ダイアログ #123 を表示する」ように指示するだけで、Android がその ID を使用してコードを呼び出すメソッドを使用する (現在は廃止され、 に置き換えられた) マネージド ダイアログとLoaderManager非常によく似ています。 ; ローダーについても同じです: "load loader #123", Android は を呼び出します。DialogFragmentonCreateDialogonPrepareDialogonCreateLoader()

唯一の明らかな欠点は、最初はフレームワークLoaderManagerに大きく依存していることでContentProviderあり、一部の人々はそれを本当に嫌っているようです. 確かに、これは追加の学習とコードですが、ContentProvider独自のデータ用の を取得すると (アプリでプライベートに使用する場合でも)、すべてのデータからビューへのバインドは で簡単に行うことができCursorLoaderます。私見ですが、独自の「コンテンツ プロバイダー」を展開することと実際に実装することの間にはほとんど違いはありませんContentProviderが、これは非常に物議を醸す私の意見です :)

3) startManagingCursor/stopManagingCursor が非推奨であることはわかっていますが、(少なくとも当面は) Honeycomb をターゲットにしておらず、新しい CursorLoader を今のところ扱いたくありません。ただし、上記のチュートリアルでは、startManagingCursor があらゆる場所で使用されていますが、stopManagingCursor は一度も呼び出されません。なぜだめですか?Androidは独自の方法でそれを処理しますか? stopManagingCursor を呼び出す必要がある状況はありますか?

startManagingCursor()電話したらCursor、もうあなたの問題ではありません。Android は、破棄されたときに Cursor を閉じますActivity(ユーザーが移動したり、向きを変更したり...)。startManagingCursor()への呼び出しと への呼び出しを一致させる必要はありません。通常、一度それを取り除いてしまうと、再びstopManagingCursor()管理する負担を負いたくないでしょう。Cursor

于 2011-09-29T21:40:20.983 に答える