rotacion - manejando la rotación de pantalla en android studio
evitar reiniciar el fragmento asynctask en el cambio de orientación de la pantalla (3)
Parece que este enfoque es el menos recomendado. Si está inicializando y ejecutando su AsyncTask
dentro de su método onCreate()
, le sugiero que use este enfoque. Básicamente consiste en guardar los datos que no necesita reiniciar en un cambio de configuración de tiempo de ejecución, para que pueda manejarlos posteriormente en el método onCreate () y decidir qué información desea conservar del paisaje anterior y cuál debe reiniciarse.
Estoy desarrollando una aplicación para tableta Android y necesito implementar la orientación de la pantalla (paisaje y retrato). cuando la orientación de la pantalla cambia el fragmento asyntactask se reinicia de nuevo. (a veces, falla de la aplicación) Necesito dejar de reiniciar la asynctask y solicitar datos nuevamente. desea cargar los datos json existentes en la nueva pantalla. cualquier ayuda aprecie
approch: android:configChanges="keyboardHidden|orientation|screenSize"
no funciona porque estoy usando una clase de fragmento.
Puede encontrar algún truco (incluso silenciar los cambios de configuración o retener la instancia) para que funcione, pero realmente los AsyncTask
son malvados y usted debe mantenerse todo lo lejos que pueda de él la mayor parte del tiempo.
Si su AsyncTask
actual de AsyncTask
es cargar algunos datos de la red antes de mostrarlos dentro de su Fragment
, le recomendaría utilizar un AsyncTaskLoader
. Los ejemplos en javadoc deberían darle una buena idea de cómo implementarlo.
Esto permitirá que la solicitud de la red continúe mientras gira, para notificar a la IU (es decir, LoaderManager.LoaderCallbacks
) con el resultado solo cuando esté listo para procesarlo (por lo que no está girando, por ejemplo), y también almacenará en caché el resultado 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 resolver este problema tan común también, y Loader
s también tienen sus complejidades, pero si entiendo tu caso de uso correctamente, debería ser justo lo que necesitas.
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.
Puede evitar fácilmente la "recreación" de un fragmento, simplemente usando el método setRetainInstance en él.
public void setRetainInstance (boolean retener)
Controle si una instancia de fragmento se retiene a través de la recreación de actividad (como a partir de un cambio de configuración). Esto solo se puede usar con fragmentos que no estén en la pila posterior. Si se establece, el ciclo de vida del fragmento será ligeramente diferente cuando se recrea una actividad:
• onDestroy () no se llamará (pero onDetach () seguirá siendo así, porque el fragmento se está separando de su actividad actual).
• onCreate (Bundle) no se invocará ya que el fragmento no se vuelve a crear.
• onAttach (Actividad) y onActivityCreated (Bundle) se seguirán llamando.
Puedes usar esto, por ejemplo, en tu método onCreateView, así:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
setRetainInstance(true);
// ... more of your code
}
Mientras la actividad que contiene el fragmento aún se vuelva a crear, la instancia del 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 cambio de orientación) porque el fragmento debe inflar la vista de acuerdo con el nuevo espacio / dimensiones, por lo que si está ejecutando su asynctask a partir de ese método, debe considerar mudarse al método onCreate (que solo se ejecutará una vez) para evitar el "relanzamiento" de cada cambio de orientación.
Espero eso ayude.