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.

¿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(); } 

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.

  • Android.view.InflateException: Archivo XML binario línea # 10: Error al inflar fragmento de clase
  • Android: TabHost - pasar los parámetros a los fragmentos
  • Barra de herramientas y Fragmento
  • Comunicarse entre presentadores en la aplicación MVP android
  • No se puede cambiar el identificador de contenedor del fragmento SupportMapFragment
  • ¿Qué método se llama después de popBackStack?
  • ¿Cómo implementar un gesto de deslizamiento entre fragmentos?
  • "La actividad ha sido destruida" a veces cuando se puebla viewpager con fragmentos
  • Fragmento de transacción no funciona cuando se utiliza AppCompatActivity o FragmentActivity
  • Android ActionBar siempre null
  • Evitar reiniciar fragmento asynctask en cambio de orientación de pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.