Погрузчики в Android Honeycomb
Я пытаюсь понять, как использовать Loaders
в Android 3.0, но, похоже, не может заставить его работать. Документы описывают только с помощью CursorLoader
, но я использую AsyncTaskLoader
.
В документах кажется, что вам нужно только реализовать AsyncTaskLoader.loadInBackground()
, но он никогда не будет вызван после getLoaderManager().initLoader()
, а затем создаст загрузчик в обратном вызове.
Я вижу сообщения отладки, говорящие Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}}
, поэтому кажется, что он создан успешно.
Возможно ли, что загрузчики в настоящее время повреждены в SDK или есть какой-то метод, который необходимо вызвать после создания загрузчика? (они не сделали этого в примере CursorLoader
).
EDIT: Кажется, что вызов forceLoad()
на загрузчике, возвращаемом с initLoader()
, начинает загрузку по крайней мере, но это означает, что вы не можете правильно обрабатывать вращения: (
Ответы
Ответ 1
Dianne Hackborn ответила на трекер ошибок и направила нас к реализации статической библиотеки. CursorLoader делает forceLoad(), поэтому он работает.
См. мой прикрепленный класс для класса, который обрабатывает это для вас в большинстве простых случаев в трекере ошибок: http://code.google.com/p/android/issues/detail?id=14944
Ответ 2
Вам нужно переопределить метод onStartLoading(). Посмотрите пример на веб-сайте .
/**
* Handles a request to start the Loader.
*/
@Override protected void onStartLoading() {
if (mApps != null) {
// If we currently have a result available, deliver it
// immediately.
deliverResult(mApps);
}
// Start watching for changes in the app data.
if (mPackageObserver == null) {
mPackageObserver = new PackageIntentReceiver(this);
}
// Has something interesting in the configuration changed since we
// last built the app list?
boolean configChange = mLastConfig.applyNewConfig(getContext().getResources());
if (takeContentChanged() || mApps == null || configChange) {
// If the data has changed since the last time it was loaded
// or is not currently available, start a load.
forceLoad();
}
}
Ответ 3
Алекс;
Вы пытались проверить, вызван ли вызов onLoadInBackground()?
onLoadInBackground(): вызов рабочего потока для выполнения фактической нагрузки. Реализации не должны доставлять результат напрямую, но должны возвращать их из этого метода, что в конечном итоге приведет к вызову deliverResult (D) в потоке пользовательского интерфейса. Если реализации должны обрабатывать результаты в потоке пользовательского интерфейса, они могут переопределить deliverResult (D) и сделать это там.