Loader: onLoadFinished sólo se llama una vez
Tengo un cargador que se utiliza en una actividad. Soy capaz de iniciar el cargador y se llama onLoadFinished. Cuando actualizo datos y llamo a onContentChanged
en el cargador veo que loadInBackground
y deliverResult
son llamados. Aquí es donde el sendero parece detenerse. No recibo ninguna devolución de llamada a onLoadFinished
.
Si vuelvo a crear la actividad (también conocido como cambio de orientación, o relanzar) entonces se comportará de la misma manera.
- Enviar mensaje a un manejador en un hilo muerto al obtener una ubicación de un IntentService
- Gridview sin fin
- ¿Cómo escoge gradle ciertas urls para buscar un repositorio? ¿Cómo lo apunto en la dirección correcta para que pueda importar este JAR?
- Combinar múltiples RecyclerView.Adapter para usar con RecyclerView único (Android)
- Marco del cargador vs AsyncTask simple
Estoy utilizando el cargador de soporte-v4 y el administrador del cargador.
Mi SharedPreferenceLoader
basado en el cargador de CommonsWare :
public class SharedPreferencesLoader extends AsyncTaskLoader<SharedPreferences> implements SharedPreferences.OnSharedPreferenceChangeListener { private SharedPreferences prefs = null; private static final String TAG = SharedPreferencesLoader.class.getSimpleName(); public SharedPreferencesLoader(Context context) { super(context); } @Override public SharedPreferences loadInBackground() { Log.v(TAG, "wol: load in background"); prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); prefs.registerOnSharedPreferenceChangeListener(this); return (prefs); } @Override protected void onStartLoading() { if (prefs != null) { deliverResult(prefs); } if (takeContentChanged() || prefs == null) { forceLoad(); } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Log.v(TAG, "wol: on shared preference changed."); onContentChanged(); } }
A continuación se muestra cómo se está utilizando el cargador:
public class MainActivity extends ActionBarActivity implements LoaderManager.LoaderCallbacks<SharedPreferences> { private static final String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportLoaderManager().initLoader(0, null, this); // fetch list of locations through an intent service. // This will save data to shared preferences and trigger onContentChanged MyIntentService.startActionGetLocations(this); } @Override public Loader<SharedPreferences> onCreateLoader(int i, Bundle bundle) { return new SharedPreferencesLoader(this); } @Override public void onLoadFinished(final Loader<SharedPreferences> sharedPreferencesLoader, final SharedPreferences sharedPreferences) { final List<PwStructure> locations = SharedPreferencesUtils.getLocations(sharedPreferences, this); Log.v(TAG, "wol: on load finished: "+locations); /* Do something with data. */ } @Override public void onLoaderReset(final Loader<SharedPreferences> sharedPreferencesLoader) { } }
Actualización He encontrado esto en la fuente LoaderManager . Parece que la llamada a onLoadFinished
no se llama si los datos tienen la misma referencia.
- Guardar / recuperar el "Rich Formatted Text" en la base de datos sin perder su formato
- Utilizar MergeAdapter; buscando una manera de determinar el tipo de datos de un elemento de lista en el método ListActivity onListItemClicked
- Obtener SQLiteCursorLoader para observar los cambios de datos
- WakefulIntentService aclaraciones de implementación
- Por el poder de MergeAdapter, StickyListHeaders y ListViewAnimations combinados Soy el capitán Android
- ListView aleatorio IndexOutOfBoundsException en Froyo
- Quitar vista de MergeAdapter
- La calidad de vista previa de la cámara en Android es mala
Sí, parecería que con la implementación actual de LoaderManager, SharedPreferencesLoader está prácticamente atornillado. Lo desaprobaré.
¡Gracias por señalar esto!