Intereting Posts

OnLoadFinished не вызывается после возврата из кнопки HOME нажмите

При использовании пользовательского AsyncTaskLoader для загрузки данных из веб-службы, если я AsyncTaskLoader кнопку HOME в середине процесса загрузки и снова запустил приложение, метод onLoadFinished () не будет вызываться. Мой фрагмент вызывает setRetainInstance(true) в onActivityCreated() а также вызывает getLoaderManager.initLoader(0, null, this) в том же методе (как рекомендуется).

Во время тестирования я вижу, что, возвращаясь к фрагменту onActivityCreated() , не вызывается, поэтому это может быть почему onLoadFinished() не вызывается. Но где еще поставить метод initLoader() ? Я читал в нескольких местах, что его не следует вызывать в onResume() .

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

Solutions Collecting From Web of "OnLoadFinished не вызывается после возврата из кнопки HOME нажмите"

Рассмотрев выпуск 14944 ( http://code.google.com/p/android/issues/detail?id=14944 ), я решил проблему, переопределив onStartLoading() в моем пользовательском AsyncTaskLoader и вызвал forceLoad() .

Еще лучшим решением является создание настраиваемого родительского AsyncTaskLoader который выглядит так (взято из предложения alexvem из приведенной выше ссылки):

 public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> { private D data; public AsyncLoader(Context context) { super(context); } @Override public void deliverResult(D data) { if (isReset()) { // An async query came in while the loader is stopped return; } this.data = data; super.deliverResult(data); } @Override protected void onStartLoading() { if (data != null) { deliverResult(data); } if (takeContentChanged() || data == null) { forceLoad(); } } @Override protected void onStopLoading() { // Attempt to cancel the current load task if possible. cancelLoad(); } @Override protected void onReset() { super.onReset(); // Ensure the loader is stopped onStopLoading(); data = null; } } 

Вызовите getLoaderManager.initLoader() на onStart() вместо onActivityCreated() , например:

 @Override public void onStart(){ super.onStart(); getLoaderManager.initLoader(0, null, this); } 

Это сработало для меня 🙂