Evitar reiniciar fragmento asynctask en cambio de orientación de pantalla

Estoy desarrollando una aplicación para Android y necesito implementar la orientación de la pantalla (horizontal y vertical). Cuando la orientación de la pantalla cambia el fragmento asyntactask reiniciando de nuevo. (A veces falla la aplicación) Tengo que parar de reiniciar el asynctask y solicitar datos de nuevo. Desea cargar los datos json existentes en la nueva pantalla. Cualquier ayuda apreciar.

Approch: android:configChanges="keyboardHidden|orientation|screenSize" no funciona porque estoy usando una clase de fragmento.

Usted puede encontrar algo de hack (incluyendo silenciar los cambios de configuración o retener la instancia) de alguna manera conseguir que funcione, pero realmente AsyncTask s son malvados y usted debe permanecer lo más lejos posible de ella la mayor parte del tiempo.

Si el trabajo actual de AsyncTask es cargar algunos datos de la red antes de mostrarlos dentro de su Fragment , recomendaría usar un AsyncTaskLoader . Los ejemplos en el javadoc deberían darle una buena idea de cómo implementarlo.

Esto permitirá que la solicitud de red continúe mientras gira, para notificar la UI (es decir, el LoaderManager.LoaderCallbacks ) con el resultado sólo cuando está listo para procesarlo (por lo que no durante la rotación, por ejemplo), y también el resultado en caché Para que no vuelva a emitir la solicitud de red cada vez que necesite los datos.

Hay un montón de bibliotecas de terceros tratando de abordar este problema muy común también, y Loader s también tienen sus complejidades, pero si entiendo su caso de uso correctamente debe ser justo lo que necesita.

No olvide que cualquier solución que elija tendrá que dar cuenta de la rotación (actividad destruir / recrear) que ocurre antes, durante y después de la carga de los datos.

Parece que este enfoque es el menos recomendado. Si está inicializando y ejecutando su AsyncTask dentro de su método onCreate() , sugeriría usar este enfoque. Básicamente consiste en guardar los datos que no necesitas reiniciar en un cambio de configuración de ejecución, para que puedas manejarlos después en el método onCreate () y decidir qué información quieres conservar del paisaje anterior y que debes reiniciar.

Usted puede evitar fácilmente la "recreación" de un fragmento, simplemente usando el método setRetainInstance en él.

Public void setRetainInstance (retención booleana)

Controlar si una instancia de fragmento se conserva a lo largo de la recreación de actividad (por ejemplo, a partir de un cambio de configuración). Esto sólo puede usarse con fragmentos que no estén en la pila trasera. Si se establece, el ciclo de vida de los fragmentos será ligeramente diferente cuando se recrea una actividad:
• onDestroy () no será llamado (pero onDetach () seguirá siendo, porque el fragmento se está desvinculando de su actividad actual).
• OnCreate (Bundle) no se llamará ya que el fragmento no se vuelve a crear.
• OnAttach (Activity) y onActivityCreated (Bundle) seguirán siendo llamados.

Enlace de referencia

Puede usar esto, por ejemplo, en el método onCreateView, como este:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { setRetainInstance(true); // ... more of your code } 

Mientras la Actividad que contiene el fragmento sigue creando, la instancia de fragmento será la misma y se volverá a conectar a la nueva actividad.

Tenga en cuenta que incluso con setRetainInstance el método onCreateView se llamará siempre (en el cambio de orientación) porque el fragmento necesita inflar la vista de acuerdo con el nuevo espacio / dimensiones, por lo que si está ejecutando su asynctask de ese método, Al método onCreate (que sólo se ejecutará una vez) para evitar el "relanzamiento" de cada cambio de orientación.

Espero eso ayude.

  • VideoView no sigue la configuración de orientación de la actividad
  • El emulador de Android no gira al paisaje
  • ¿Cómo mantener abierta la ventana emergente cuando la orientación cambia en tiempo de ejecución en Android?
  • ¿Cómo hacer que la interfaz de usuario se vea igual en modo horizontal?
  • Detectar si el video se tomó en modo retrato / paisaje
  • Manera de la insensatez a manejar Fragmento en cambio de la orientación
  • Forzar cierre en modo horizontal, pero no en vertical
  • ¿No puede guardar y restaurar un Fragmento anidado?
  • Android TimePicker parece recortado
  • ¿Cómo puedo establecer un ancho máximo en un LinearLayout para que no se estire en modo horizontal?
  • YouTubePlayerSupportFragment en una aplicación de una sola actividad con cambio de orientación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.