Подтвердить что ты не робот

Погрузчики в 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(), начинает загрузку по крайней мере, но это означает, что вы не можете правильно обрабатывать вращения: (

4b9b3361

Ответ 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) и сделать это там.