Загрузчики в Android Honeycomb

Я пытаюсь понять, как использовать Loaders в Android 3.0, но не могу заставить его работать. Документы описывают только использование CursorLoader, но я использую AsyncTaskLoader.

Из документов кажется, что вам нужно только реализовать AsyncTaskLoader.loadInBackground(), но он никогда не вызывается после getLoaderManager().initLoader(), а затем создает загрузчик в обратном вызове.

Я вижу сообщения об отладке, говорящие Created new loader LoaderInfo{4040a828 #0 : ArticleDataLoader{4036b350}}, поэтому кажется, что он успешно создан.

Возможно ли, что загрузчики в настоящее время не работают в SDK или есть какой-то метод, который вам нужно вызвать после создания загрузчика? (они не сделали этого в примере CursorLoader).

РЕДАКТИРОВАТЬ: похоже, что вызов forceLoad() в загрузчике, возвращенном из initLoader(), по крайней мере, запускает загрузку, но это означает, что вы не можете правильно обрабатывать повороты :(


person alexanderblom    schedule 07.02.2011    source источник
comment
Если вы найдете ответ на этот вопрос, пожалуйста, дайте мне знать. Я не смог ничего найти.   -  person Brian Griffey    schedule 26.02.2011
comment
Также есть code.google.com/p/android/issues/detail? id=14944, в котором упоминается тот же обходной путь, что и в комментарии «Изменить».   -  person typo.pl    schedule 26.02.2011
comment
Да, это мой отчет об ошибке по этому поводу :)   -  person alexanderblom    schedule 27.02.2011


Ответы (3)


Дайан Хакборн ответила на баг-трекер и порекомендовала нам реализацию статической библиотеки. CursorLoader выполняет forceLoad(), поэтому он работает.

См. мой прикрепленный класс для класса, который обрабатывает это для вас в большинстве простых случаев в системе отслеживания ошибок: http://code.google.com/p/android/issues/detail?id=14944

person alexanderblom    schedule 27.03.2011
comment
им действительно нужно документировать CPL ›.‹ - person Nathan Schwermann; 18.05.2011
comment
Это действительно отстой. Итак, приведенный здесь пример: developer.android.com/reference/android/content/ если вы используете библиотеку поддержки, не будет работать, если вы не переопределите onStartLoading - person Blundell; 05.10.2012
comment
Итак, теперь у меня есть собственный справочный источник для ASyncTaskLoader, использующий библиотеку поддержки: blog.blundell-apps.com/ - person Blundell; 05.10.2012

Вам нужно переопределить метод 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();
        }
    }
person zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz    schedule 23.06.2012

Алекс; Вы пытались проверить, вызывается ли вообще onLoadInBackground()?

onLoadInBackground (): вызывается в рабочем потоке для выполнения фактической загрузки. Реализации не должны доставлять результат напрямую, но должны возвращать его из этого метода, что в конечном итоге приведет к вызову deliveryResult(D) в потоке пользовательского интерфейса. Если реализациям необходимо обработать результаты в потоке пользовательского интерфейса, они могут переопределить deliveryResult(D) и сделать это там.

person Developerx    schedule 03.03.2011
comment
Нет, он не вызывается, пока вы не выполните forceLoad(). - person alexanderblom; 04.03.2011