Android Loader не запускает обратные вызовы на экране вращаются
Я использую AsyncTaskLoader
. У меня есть активность, которая реализовала LoaderCallbacks
(Библиотека поддержки).
У меня точка останова отлажена и помещена в журналы, загрузчик доставляет результат, однако второй раз обратный вызов onLoadFinished
не запускается. Странная вещь - когда я поворачиваюсь назад, она работает, и когда-либо ориентация, которую я начинаю, получает обратные вызовы, когда я возвращаюсь к ней.
В моей деятельности onResume
:
LoaderManager lm = getSupportLoaderManager();
Loader loader = lm.initLoader(0, null, new LoaderManager.LoaderCallbacks<String>() {
@Override
public Loader<String> onCreateLoader(int i, Bundle bundle) {
Loader<String> loader = new TestLoader(MainActivity.this);
return loader;
}
@Override
public void onLoadFinished(Loader<String> stringLoader, String s) {
Log.d(Application.TAG, "OnLoadFinished " + s);
doStuff(s);
}
@Override
public void onLoaderReset(Loader<String> stringLoader) {
// NOP
}
});
В моем загрузчике:
public class TestLoader extends AsyncTaskLoader<String> {
private String mData;
public TestLoader(Context context) {
super(context);
}
// This get called after a loader is initialized or a loader
// that is alive still is reset
@Override
public void onStartLoading() {
if (mData != null) { // Have our data loaded, just deliver it!
deliverResult(mData);
}
if (takeContentChanged() || mData == null) {
forceLoad();
}
}
// This is called when an Activity or Fragment requests a loader
// to be reset because they want new data
@Override
public void onReset() {
mData = null;
// Ensure that the old task is cancelled if it was running
// We do NOT have to call forceLoad here because onStartLoading
// will get called after this
cancelLoad();
}
// Here we just want to store our own data we got and reset our boolean
@Override
public void deliverResult(String data) {
Log.d(Application.TAG, "deliverResult " + data);
mData = data;
super.deliverResult(mData);
}
@Override
public String loadInBackground() {
// returns content from a content provider ...
}
}
Действительно сбитый с толку этот, я новичок в Android, так что, возможно, это очевидно для кого-то еще:)
Ответы
Ответ 1
Вы должны хотя бы просто вызвать getSupportLoaderManager()
/getLoaderManager()
в onCreate()
, если это Activity
или onActivityCreated()
, если это a Fragment
. Фактический initLoader()
может быть в другом месте. В противном случае загрузчик будет находиться в состоянии остановки и не будет выдавать результаты, даже если он завершит загрузку. Я подозреваю это, потому что диспетчер загрузчика не привязывает старые загрузчики к новому Activity
, если вышеупомянутый вызов не сделан в новом Activity
onCreate()
.
Ответ 2
У вас есть
Loader loader = lm.initLoader(...)
Вы должны иметь
Loader loader = new LoaderManager.LoaderCallbacks(...) {...}
и в onResume()
this.getLoaderManager().restartLoader(0, null, this.loader);
См. Документация загрузчиков.