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");
}
}
6 ответов:
у меня была такая же проблема с использованием библиотеки совместимости. Я решил это, позвонив
forceLoadgetLoaderManager().initLoader(0, null, this).forceLoad();очевидно, что документация по AsyncLoader отсутствует, и эта проблема также существует на HoneyComb. Более подробную информацию можно найти здесь
чиновник пример AsyncTaskLoader также вызывает forceLoad (), поэтому это не ошибка, но я все еще думаю, что это поведение не очень интуитивно понятно.
переопределение
loadInBackground()не хватает.посмотреть
AppListLoaderon 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()); }
Я обнаружил, что у каждого из вышеперечисленных решений есть проблемы, особенно когда приложение запускается, когда экран выключен, и загрузка занимает несколько минут.
вот мое решение (база на этой):
Comments