LoaderManager
この方法restartLoader()
ありますLoaderManager.restartLoader()は常にonCreateLoader()を呼び出しますか?
public abstract Loader<D> restartLoader (int id, Bundle args, LoaderCallbacks<D> callback)
、新規またはこのマネージャーの既存のローダーを再開を開始します(アクティビティ/フラグメントが現在開始されている場合)、それにコールバックを登録し、をそれをロードし始めます。同じIDを持つローダーが以前に起動されている場合、新しいローダーがその作業を完了すると自動的に破棄されます。コールバックは、古いローダーが破棄される前に配信されます。
はthe dev guideに基づいて、私は確かに、onCreateLoader
への呼び出しは常にrestartLoader()
からなりのアイデアを得る:
廃棄するには...
ローダー
を再起動し、あなたの古いデータでは、restartLoader()を使用します。たとえば、このSearchView.OnQueryTextListenerの実装は、ユーザーのクエリが変更されたときにローダーを再起動します。例では
public boolean onQueryTextChanged(String newText) {
// Called when the action bar search text has changed. Update
// the search filter, and restart the loader to do a new query
// with this filter.
mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, this);
return true;
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// NOTE: The Loader is instantiated with the user's query
Uri baseUri;
if (mCurFilter != null) {
baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
Uri.encode(mCurFilter));
} else {
baseUri = Contacts.CONTENT_URI;
}
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("
+ Contacts.DISPLAY_NAME + " != ''))";
return new CursorLoader(getActivity(), baseUri,
CONTACTS_SUMMARY_PROJECTION, select, null,
Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
}
onCreateLoader
は、ユーザーのクエリに関する情報はローダに渡される唯一の場所である、:それは新しいクエリを実行するために改訂された検索フィルタを使用できるように、ローダーを再起動する必要があります(インスタンス化時)。しかし、ドキュメントでは、「新しいを起動するか、既存のローダーを再起動する」と言って、私を捨てます。
私は 'onCreateLoader'もUIスレッドで呼び出されていると思います...! – Maarten
私はあなたがそうであると思う理由について興味がありますか?これは、ContentProvider/Datasourceと非同期でやりとりするためのローダー全体のポイントです。UIをブロックする可能性がある長期実行タスクは、onCreateLoaderで実行されます.LoaderManagerはその部分をバックグラウンドで実行します。 – NigelK
はい、はい、AsyncTaskLoaderの['loadInBackBackground'](https://developer.android.com/reference/android/content/AsyncTaskLoader.html)部分は確実にバックグラウンドスレッドで実行されますが、onCreateLoaderはUIスレッド:[ローダーのクライアントは、プロセスのメインスレッド(つまり、アクティビティのコールバックや他のことが発生しているスレッド)からローダーへの呼び出しを実行する必要があります。](https://developer.android AsyncTask'のインスタンス化に匹敵する、それは私の推論でした。 – Maarten