Загрузчики в Android Honeycomb - PullRequest
36 голосов
/ 07 февраля 2011

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

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

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

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

EDIT: похоже, что вызов forceLoad() на загрузчике, возвращенной из initLoader(), запускает загрузку по крайней мере, но это означает, что вы не можете справитьсявращение правильно: (

Ответы [ 3 ]

13 голосов
/ 27 марта 2011

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

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

1 голос
/ 23 июня 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();
        }
    }
0 голосов
/ 03 марта 2011

Alex; Вы пытались проверить, вызывается ли даже onLoadInBackground ()?

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

...