android - tipos - Global Loader(LoaderManager) para reutilizar en múltiples Actividades/Fragmentos
tipos de fragments android (4)
¿Cómo volver a conectarse al mismo cargador desde una actividad / fragmento diferente al que se inició?
No debe reutilizar los Loader
que están siendo gestionados por una instancia de LoaderManager
en múltiples Activity
y Fragment
.
El LoaderManager
iniciará / detendrá esos Loader
con respecto al ciclo de vida de la Activity
/ Fragment
, por lo que no hay forma de garantizar que esos Loader
existirán una vez que esté en otra Activity
.
De la documentación:
LoaderManager.LoaderCallbacks es una interfaz de devolución de llamada que permite a un cliente interactuar con el LoaderManager.
Se espera que los cargadores, en particular CursorLoader, retengan sus datos después de ser detenidos. Esto permite que las aplicaciones mantengan sus datos a través de la actividad o los métodos onStop () y onStart () del fragmento, para que cuando los usuarios regresen a una aplicación, no tengan que esperar a que los datos se vuelvan a cargar. Utiliza los métodos LoaderManager.LoaderCallbacks para saber cuándo crear un nuevo cargador y para decirle a la aplicación cuándo es el momento de dejar de usar los datos de un cargador.
En otras palabras, a menudo es el caso de que su Loader
sea específico para alguna actividad (o fragmento). Cuando tenga su Activity
implemente la interfaz LoaderManager.LoaderCallbacks
, a su actividad se le LoaderManager.LoaderCallbacks
tipo LoaderManager.LoaderCallbacks
. Cada vez que llama a initLoader(int ID, Bundle args, LoaderCallbacks<D> callback)
, el LoaderManager crea o reutiliza un Loader
que es específico para alguna instancia de la interfaz LoaderManager.LoaderCallbacks
(que en este caso es una instancia de su actividad). ). Básicamente, esto vincula su actividad con un cargador, y se llamarán sus métodos de devolución de llamada cuando el estado del cargador cambie.
Dicho esto, a menos que pueda encontrar una manera de hacer que sus dos Actividades separadas compartan los mismos métodos de devolución de llamada, dudo que haya una manera limpia de hacerlo (es decir, tener una Actividad y un Fragmento compartir las mismas devoluciones de llamadas suena como si fuera complicado) , si no imposible). Sin embargo, no me preocuparía demasiado. En todo el código de muestra que he visto, nunca he visto dos Actividades y / o Fragmentos que comparten los mismos métodos de devolución de llamada. Además, dado que se supone que los Activity
s y Fragment
s están diseñados para ser reutilizados, compartir los Loader
s de esta manera simplemente no parece ser algo que se fomente.
Lo que me gustaría lograr:
Tengo dos fragmentos diferentes. Me gustaría que ambos mostraran los mismos datos en dos formas (en una lista y en un mapa). Me gustaría que compartan un Loader (en particular, AsyncTaskLoader
). Todo funciona bien, pero el cargador no se reutiliza. Se crea otro y los datos se cargan dos veces.
Lo que hago:
En el Fragment
s uso LoaderManager lm = getActivity().getSupportLoaderManager();
En ambos implemento LoaderCallbacks<ArrayList<Item>>
y los métodos necesarios. En ambos uso lm.initLoader(0, args, this);
.
Pero cuando lm.toString()
el lm.toString()
parece que estos son dos cargadores diferentes. Y los datos se descargan dos veces.
¿Cómo volver a conectarse al mismo cargador desde una actividad / fragmento diferente al que se inició?
Debería ser posible ya que el contexto se adjunta al Cargador de todos modos en cada onCreate()
, por ejemplo, en el cambio de configuración.
Creo que tendrá el comportamiento deseado si usa la misma ID de Loader en sus diferentes Fragmentos y Actividades. Sin embargo, asegúrese de que la ID del cargador sea única para los datos a cargar. PhotosLoader y VideoLoader no deberían tener la misma ID, por ejemplo.
No estoy muy seguro de lo que está intentando archivar después de pasar por las discusiones. Pero hay un método application.registerActivityLifecycleCallbacks()
, que acepta escuchas de ciclo de vida de actividad global (como onActivityCreated()
).
Sí. Funciono para mi Tengo 3 fragmentos diferentes en un cajón de navegación donde los mismos datos se rellenan en diferentes ListViews. (Todos los fragmentos son parte de la MISMA actividad).
Mi AsyncTaskLoader:
public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> {
public MyTaskLoader(Context context) {
super(context);
}
@Override
public HashMap<String, Integer> loadInBackground() {
...
return hashMap;
}
...
}
Use la misma ID del cargador en todos los fragmentos.
Fragmento 1:
public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
Utilice la misma ID para Fragment2:
public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
El adaptador debe inicializarse antes de inicializar el cargador. Funciona hasta ahora. Pero, ¿es este el camino correcto? ¿Existe un método mejor para usar un cargador común para varios fragmentos?