Подтвердить что ты не робот

Можете ли вы использовать LoaderManager из службы?

У меня есть система загрузки данных, настроенная с использованием пользовательского Loader и Cursor, который отлично работает с Activity и Fragments, но в Service Service нет LoaderManager (который я могу найти). Кто-нибудь знает, почему LoaderManager был исключен из службы? Если это не так?

4b9b3361

Ответ 1

Кто-нибудь знает, почему LoaderManager был исключен из службы?

Как указано в другом ответе, LoaderManager был явно разработан для управления Loaders через жизненные циклы Acivities и Fragments. Поскольку Services не имеет этих изменений конфигурации для работы, использование LoaderManager не требуется.

Если это не так?

Да, фокус в том, что вам не нужно использовать LoaderManager, вы можете просто напрямую работать с вашим Loader, который будет обрабатывать асинхронную загрузку ваших данных и отслеживать любые основные изменения данных для вас, что очень важно лучше, чем запрашивать данные вручную.

Сначала создайте, зарегистрируйте и начните загрузку Loader при создании Service.

@Override
public void onCreate() {
    mCursorLoader = new CursorLoader(context, contentUri, projection, selection, selectionArgs, orderBy);
    mCursorLoader.registerListener(LOADER_ID_NETWORK, this);
    mCursorLoader.startLoading();
}

Затем выполните OnLoadCompleteListener<Cursor> в Service для обработки обратных вызовов нагрузки.

@Override
public void onLoadComplete(Loader<Cursor> loader, Cursor data) {
    // Bind data to UI, etc
}

Наконец, не забывайте очистить свой Loader, когда Service будет уничтожен.

@Override
public void onDestroy() {

    // Stop the cursor loader
    if (mCursorLoader != null) {
        mCursorLoader.unregisterListener(this);
        mCursorLoader.cancelLoad();
        mCursorLoader.stopLoading();
    }
}

Ответ 2

К сожалению, нет. Погрузчики были разработаны для действий и фрагментов, чтобы полностью обрабатывать изменения конфигурации, которые происходят в Activites и Fragments. т.е. вращение вашего устройства и повторное присоединение к существующим данным.

У службы нет каких-либо изменений конфигурации, она будет сидеть в фоновом режиме до тех пор, пока она не завершится или система не будет вынуждена ее убить. Поэтому, предполагая, что вы выполняете свой код в фоновом потоке в своем сервисе (каким бы вы ни были в любом случае), у них просто нет причин использовать загрузчик. Просто выполните вызовы, необходимые для запроса ваших данных.

Итак, если ваша Служба - это просто IntentService, вы можете написать свою логику, чтобы запросить данные с поддержкой курсора в методе onHandleIntent().

http://developer.android.com/guide/components/loaders.html