Будет ли LoaderManager.restartLoader() всегда приводить к вызову onCreateLoader()?

LoaderManager имеет этот метод restartLoader():

public abstract Loader<D> restartLoader (int id, Bundle args, LoaderCallbacks<D> callback)

Запускает новый или перезапускает существующий загрузчик в этом менеджере, регистрирует обратные вызовы к нему и (если активность/фрагмент в настоящее время запущен) начинает его загружать. Если ранее был запущен загрузчик с тем же идентификатором, он будет автоматически уничтожен, когда новый загрузчик завершит свою работу. Обратный вызов будет доставлен до уничтожения старого загрузчика.

Основываясь на руководстве dev, я понимаю, что вызов 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 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 - это единственное место, где информация о пользовательском запросе передается загрузчику (при создании экземпляра). Однако документы выкидывают меня, говоря "Начинает новый или перезапускает существующий Loader.

Ответ 1

Простой ответ на ваш вопрос: да, вызов restartLoader() снова вызовет onCreateLoader().

Вы можете запускать более одного загрузчика параллельно (скажем, у вас есть два элемента управления SimpleCursorAdapters), например:

getLoaderManager().initLoader(0, null, this);  //id = 0
getLoaderManager().initLoader(1, null, this);  //id = 1

onCreateLoader затем вызывается диспетчером загрузчика для каждого идентификатора (возвращаемый загрузчик затем создается асинхронно с помощью диспетчера загрузчика):

public Loader<Cursor> onCreateLoader(int id, Bundle args)
{
    if (id == 0)
        //return a Loader<Cursor> for id 0
    else if (id == 1)
        //return a Loader<Cursor> for id 1
}

Менеджер загрузчика передает результирующий загрузчик в onLoadFinished:

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
{
    if (loader.getId() == 0)
        //cursor was returned from onCreateLoader for id 0
        //perhaps do swapCursor(cursor) on an adapter using this loader
    else if (loader.getId() == 1)
        //cursor was returned from onCreateLoader for id 1
        //perhaps do swapCursor(cursor) on an adapter using this loader
}

Когда вы впоследствии вызываете загрузчик перезагрузки:

getLoaderManager().restartLoader(0, null, this);  //id = 0

... onLoaderReset сначала вызывается:

public void onLoaderReset(Loader<Cursor> loader)
{
    if (loader.getId() == 0)
        //perhaps do swapCursor(null) on an adapter using this loader
    else if (loader.getId() == 1)
        //perhaps do swapCursor(null) on an adapter using this loader
}

... а затем новый вызов onCreateLoader. Поэтому в этом отношении onCreateLoader используется как для запуска совершенно нового загрузчика, так и для существующего загрузчика reset.