Можете ли вы использовать LoaderManager из службы? - PullRequest
40 голосов
/ 02 января 2012

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

Ответы [ 2 ]

52 голосов
/ 24 июня 2014

Кто-нибудь знает, почему 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();
    }
}
18 голосов
/ 30 июня 2012

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

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

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

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

...