Fragmentos, cuando estoy "activo"?
He estado constantemente frustrado por esto y no puedo encontrar una buena respuesta, por lo que espero que alguien aquí puede ofrecer orientación.
Tengo un fragmento que utiliza AsyncTask
muy ampliamente. Estoy constantemente plagado de bugs donde el fragmento llama getActivity()
, que devuelve null. Supongo que esto está sucediendo porque algún método en el fragmento se invoca antes de que la actividad se adjunta, o después de que se separa.
- Cómo cambiar los fragmentos con el cajón de navegación de Android
- Manejo y Mitigación IllegalStateException ("estado de error: activo $ Fragmento ha borrado el índice: -1")
- Cómo comprometer Fragment transacciones en FragmentPagerAdapter en onLoadFinish método de devolución de llamada?
- Google Analytics v4: los datos no aparecen en el panel de control
- Código fuente del fragmento androide para FragmentLayout.java
¿Cuál es la forma correcta de manejar esto en mi código? No quiero tener este idioma cubierto por todo el lugar,
Activity activity = getActivity(); if (activity != null) { // do something }
Mirando a los documentos de Fragment
, puedo llegar a muchos ganchos posibles para resolver esto: isDetached()
, onActivityCreated()
, onAttach()
, isResumed()
, y así sucesivamente. ¿Cuál es la combinación correcta?
EDITAR:
Algunas personas han sugerido cancelar tareas cuando se detuvo, pero esto implica que el idioma estándar,
new AsyncTask<...>.execute();
No puede ser usado. Esto implica que cada exec'd AsyncTask
necesita ser rastreado hasta completarse o cancelado. Simplemente nunca he visto que en el código de ejemplo de Google o en otros lugares. Algo como,
private final Set<AsyncTask<?>> tasks = new HashSet<>; ... AsyncTask<?> t = new AsyncTask<...>() { ... public void onPostExecute(...) { tasks.remove(this); ... } } tasks.add(t); t.execute(); ... @Override public void onPause() { for (AsyncTask<?> t: tasks) { t.cancel(); } tasks.clear(); }
- IOS Facebook Slide Menu para Android
- Android quita el fragmento y la vista de BackStack
- Cómo hacer un bucle ViewPager?
- OnViewCreated con la biblioteca de compatibilidad
- Cómo implementar un ViewPager con diferentes Fragmentos / Layouts
- No se puede resolver FragmentActivity ejecutándose en Android 2.3.3 con el paquete de compatibilidad v4
- DialogFragment de Android vs Diálogo
- Agregar un 'Botón Añadir' a la barra de acción en la parte superior cuando ya tienes pestañas y un menú
Intente cancelar sus AsyncTasks en los métodos onPause
o onStop
. Esto evitará que onPostExecute
sea llamado cuando el Fragment
ya no está activo ( getActivity()
devuelve null
).
O puede comprobar si el Fragment
se adjunta llamando a this.isAdded()
en su Fragment
.
Respondiendo mi propia pregunta
No pude encontrar una buena solución. En resumen, utilice un Loader
o compruebe que getActivity()
no devuelve null antes de usarlo. I miró en el uso de Loader
s, pero el patrón hace un montón de suposiciones sobre la estructura de la aplicación y la naturaleza de la recuperación de datos que no funcionó para mí.
En términos de coordinación de ciclos de vida, sigo en la actividad onActivityCreated
como un punto de referencia mental – marca el punto en el que la actividad subyacente ha terminado su propio onCreate
. Antes de que no creo que hay una actividad para getActivity()
de.
Que obtener actividad está volviendo nulo suena como si usted está llamando a getActivity () demasiado temprano (es decir, antes de que se cree) o demasiado tarde (es decir, cuando dejó de interactuar con el fragmento). Detener las tareas en onPause()
evitaría que getActivity devuelva null, ya que cortaría la tarea una vez que el fragmento dejara de interactuar con la actividad subyacente debido a que la actividad misma estaba en pausa. Creo que esperar a onStop()
puede ser demasiado tarde, ya que, si la tarea debía seguir ejecutándose cuando la actividad subyacente se detuvo todavía puede reutrn null.
- ¿Hay algún código para establecer el papel tapiz sin recortar y hacer zoom en android?
- Desplome de la disposición de JellyBean