Android AsyncTaskLoader не запускает loadInBackground?



Я пытаюсь реализовать пример загрузчика на Android, но не могу заставить его запустить загрузчик. Я использую следующий код. Он попадет в "Создать загрузчик", но он никогда не достигнет сообщения журнала" загрузка начата". Я пропустил звонок, который мне нужен?



действие:



    public class TestingZoneActivity extends ListActivity implements LoaderCallbacks<ArrayList<Content>>{

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

getLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<ArrayList<Content>> onCreateLoader(int id, Bundle args) {
Log.e("TEST", "Create Loader");
return new ImageLoader(this);
}

@Override
public void onLoadFinished(Loader<ArrayList<Content>> loader, ArrayList<Content> data) {
setListAdapter(new ImageAdapter(this, data));
}

@Override
public void onLoaderReset(Loader<ArrayList<Content>> loader) {
setListAdapter(null);
}
}


загрузчика:



    public class ImageLoader extends AsyncTaskLoader<ArrayList<Content>> {

public ImageLoader(Context context) {
super(context);
}

@Override
public ArrayList<Content> loadInBackground() {
Log.e("TEST", "Loading started");
}

}
313   6  

6 ответов:

у меня была такая же проблема с использованием библиотеки совместимости. Я решил это, позвонив forceLoad

getLoaderManager().initLoader(0, null, this).forceLoad();

очевидно, что документация по AsyncLoader отсутствует, и эта проблема также существует на HoneyComb. Более подробную информацию можно найти здесь

чиновник пример AsyncTaskLoader также вызывает forceLoad (), поэтому это не ошибка, но я все еще думаю, что это поведение не очень интуитивно понятно.

переопределение loadInBackground() не хватает.

посмотреть AppListLoader on http://developer.android.com/reference/android/content/AsyncTaskLoader.html .

по крайней мере, добавьте эти два метода в ваш загрузчик:

        @Override
        protected void onStartLoading() {
            if (takeContentChanged())
                forceLoad();
        }

        @Override
        protected void onStopLoading() {
            cancelLoad();
        }

и звонок onContentChanged() из своего конструктора.

rraystсовет довольно компактный. Если вы пишете свой метод так:

protected void onStartLoading() {
    forceLoad();
}

вы заметите, что когда появляется дочерняя активность, а затем вы возвращаетесь к родительской,onStartLoading (и так loadInBackground) называются снова!

что можно сделать? Установите внутреннюю переменную (mContentChanged) в true внутри конструктора; затем проверьте эту переменную внутри onStartLoading. Только когда это правда, начните загрузку по-настоящему:

package example.util;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

public abstract class ATLoader<D> extends AsyncTaskLoader<D> {

    public ATLoader(Context context) {
        super(context);
        // run only once
        onContentChanged();
    }

    @Override
    protected void onStartLoading() {
        // That's how we start every AsyncTaskLoader...
        // -  code snippet from  android.content.CursorLoader  (method  onStartLoading)
        if (takeContentChanged()) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }
}

Я не думаю, что принятый ответ является правильным решением, так как причины loadInBackground() вызывается чаще, чем необходимо, т. е. при изменении ориентации, что не происходит при правильном переопределении следующих методов в загрузчике:

@Override
public void deliverResult(final List<Participant> data) {
    participants = data;

    if (isStarted()) {
        super.deliverResult(data);
    }

}

@Override
protected void onStartLoading() {
    if (takeContentChanged() || participants == null) {
        forceLoad();
    }
}

Если вы используете пользовательский загрузчик, вы можете сохранить последнюю ссылку на данные и получить ее через геттер. когда пользователь поворачивает свой экран, вы можете получить загрузчик обратно из getLoaderManager().метод getLoader, а затем вернуть ссылку. Для моего тестирования я заметил, что startLoadering проходит весь путь до CustomLoader.onLoadFinished но результат никогда не доставит деятельности.onLoadFinished.Я подозреваю, что ссылка на активность теряется при ротации. Кстати великая вещь о создании загрузчиков является ли они постоянными через LoaderManager. Думайте об этом как о другом аромате безголовых фрагментов.. лол.

Loader loader  =  getLoaderManager().getLoader(LOADER_ID);

if( loader == null )
{
    getLoaderManager().initLoader(LOADER_ID, null, MyActivity.this );
}
else
{
    listAdapter.addAll(((CustomLoader) loader).getLastData());
}

Я обнаружил, что у каждого из вышеперечисленных решений есть проблемы, особенно когда приложение запускается, когда экран выключен, и загрузка занимает несколько минут.

вот мое решение (база на этой):

https://stackoverflow.com/a/22675607/878126

Comments

    Ничего не найдено.