Android Loader не запускает обратные вызовы на экране.

Я использую AsyncTaskLoader . У меня есть активность, которая реализовала LoaderCallbacks (Библиотека поддержки).

Я отлаживаю onLoadFinished останова и помещаю в журналы, загрузчик поставляет результат, однако второй раз обратный вызов 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's 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, поэтому, возможно, это очевидно для кого-то другого 🙂

Solutions Collecting From Web of "Android Loader не запускает обратные вызовы на экране."

Вы должны хотя бы просто вызвать getSupportLoaderManager() / getLoaderManager() в onCreate() если это Activity или onActivityCreated() если это Fragment . Фактический initLoader() может быть в другом месте. В противном случае загрузчик будет находиться в состоянии остановки и не будет выдавать результаты, даже если он завершит загрузку. Я подозреваю, что это связано с тем, что диспетчер загрузчика не привязывает старые загрузчики к новой Activity если вышеупомянутый вызов не был сделан в onCreate() новой Activity .

У тебя есть

 Loader loader = lm.initLoader(...) 

Вы должны иметь

 Loader loader = new LoaderManager.LoaderCallbacks(...) {...} 

И в вашем onResume()

 this.getLoaderManager().restartLoader(0, null, this.loader); 

См. Документацию по загрузчикам .