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.
- YouTubePlayerSupportFragment en una aplicación de una sola actividad con cambio de orientación
- Diferentes orientaciones de pantalla
- ¿Por qué se llama onCreate () después de onConfigurationChanged?
- Evitar que la actividad se reinicie cuando cambie la orientación
- Cómo rotar vistas sobre el cambio de orientación sin volver a crear el diseño?
- Mis opiniones se están restableciendo en el cambio de orientación
- Detectar si el video se tomó en modo retrato / paisaje
- Cómo alinear un elemento a la derecha en LinearLayout horizontal?
- Orientación Cambiado Evento u Oyente Android
- ¿Cuál es la diferencia conceptual entre sensor de vector de rotación y sensor de orientación en Android?
- Cómo detectar Orientación al revés en android?
- Redibujar múltiples rutas en las mismas posiciones de la orientación anterior de la disposición
- action_image_capture reinicia la aplicación
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.
- Cómo asegurarse de que los datos se guardarán antes de que android mata un proceso
- No pudo instalar servicios de Google Play: descarga interrumpida