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