Android – onLoadFinished не называется

Я столкнулся с проблемой с загрузчиком.

У меня есть Activity, который отображает список записей, полученных из локальной базы данных. Когда действие начинается, записи автоматически загружаются с помощью метода LoaderManager.initLoader ().

Также есть возможность вручную обновить список с помощью кнопки обновления в ActionBarSherlock. Однако после завершения другого действия, которое добавляет запись в БД, onLoadFinished не вызывается.

Я использую SimpleCursorLoader и вот фрагмент кода из действия:

@Override public void onStart() { ... getSupportLoaderManager().initLoader(0, null, this); } @Override public void onPause() { ... getSupportLoaderManager().destroyLoader(0); } public void refreshRecords() { getSupportLoaderManager().restartLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, final Bundle args) { Loader<Cursor> l = new SimpleCursorLoader(this) { @Override public Cursor loadInBackground() { return recordDAO.getCursor(); } }; l.forceLoad(); return l; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor c) { // updateUI } @Override public void onLoaderReset(Loader<Cursor> loader) { } 

Проблема в том, что после завершения другой операции onLoaderCreate , но onLoaderFinished не вызывается.

После некоторой отладки, я обнаружил, что SimpleCursorAdapter.deliverResults() также вызывается, бутон заканчивается на .. if (isReset()) { ..

Я что-то упускаю? Как принудительно перезагрузить данные?

заранее спасибо

Я, наконец, нашел решение этой проблемы благодаря обсуждению

https://groups.google.com/forum/#!topic/android-developers/DbKL6PVyhLI

 public static <T> void initLoader(final int loaderId, final Bundle args, final LoaderCallbacks<T> callbacks, final LoaderManager loaderManager) { final Loader<T> loader = loaderManager.getLoader(loaderId); if (loader != null && loader.isReset()) { loaderManager.restartLoader(loaderId, args, callbacks); } else { loaderManager.initLoader(loaderId, args, callbacks); } } 

Решение RaB не работает для меня

Мое работаемое решение всегда уничтожало Loader перед перезагрузкой

 Loader<Cursor> loader = mLoaderManager.getLoader(mKeyLoader); if (loader != null) { mLoaderManager.destroyLoader(mKeyLoader); } mLoaderManager.restartLoader(mKeyLoader, args, this); 

Fwiw, у меня была аналогичная проблема, когда вы пытались немедленно перезагрузить загрузчик во второй раз, прежде чем был вызван первый onLoadFinished, в результате чего не было вызвано.

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

 if( loader == null ) loader = loaderMngr.initLoader( 0, null, myLoaderCallbacks ); else if( loader.isAbandoned() ) return; else loaderMngr.restartLoader( 0, null, myLoaderCallbacks ); 

В дополнение к ответу RaB, если вы используете пользовательский Loader , убедитесь, что если вы вызываете super если вы перезаписываете deliverResult() :

 @Override public void deliverResult(D data) { super.deliverResult(data); // <--onLoadFinished() will not be called if you don't call this ... }