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.
- Fragmento android creado dos veces en el cambio de orientación
- Cómo obtener los detalles de portrait_id, Landscape_id y de dominio para android desde el servidor revive
- SCREEN_ORIENTATION_LANDSCAPE al revés - ¿Por qué?
- Establecer la orientación horizontal en android en ambos lados
- Lista de retención en el fragmento de lista sobre el cambio de orientación
- Reproductor multimedia no carga cuando la actividad recreada en la orientación cambia android
- Orientación de la captura de la cámara en dispositivos samsung en android
- Mejor manera: Guardar y restaurar la posición de TextView en ScrollView
- Cuadros de permisos múltiples en Android usando Iniciar sesión con Google después del cambio de orientación
- cómo guardar el estado con onSaveInstanceState y onRestoreInstanceState mientras cambia la orientación
- Diferentes orientaciones de pantalla
- Necesita ayuda en la orientación de la pantalla de Android
- Cómo quitar las pestañas de ActionBar en la orientación horizontal sólo para las tabletas
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