Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Detener el controlador después de que se haya destruido el fragmento

Tengo un Fragment que establece un ListView y crea un Handler para actualizar el Listview periódicamente. Sin embargo, parece que el Handler sigue funcionando después de que el Fragment haya sido destruido.

El siguiente es el código.

  • Diálogo de Android: Eliminación de la barra de título
  • Envía un enlace al grupo de whatsapp directamente desde el navegador (o desde la aplicación)
  • ¿Cómo afecta DialogFragment al ciclo de vida del Fragmento llamante?
  • Obtener el elemento seleccionado y su posición en RecyclerView
  • Cómo ejecutar la actividad en segundo plano en Android
  • Comparación de imágenes de mapa de bits en Android
  •  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //boilerplate code final Handler handler = new Handler(); handler.post(new Runnable() { @Override public void run() { assignAdapter(); handler.postDelayed(this, 15000); } }); return v; } 

    Actualizar el ListView después de la destrucción del Fragment hace que la aplicación se bloquee. ¿Cómo puedo hacer que el Handler detenga cuando el Fragment es destruido? También me gustaría saber qué efectos si cualquier pausa de la aplicación tiene en el Handler también.

  • Guardar bitmap en la función de archivo
  • El método getApplicationContext () es indefinido - fragmento de problemas
  • Android Fragment no se encontró ninguna vista para ID?
  • Android: espera en la entrada del usuario desde el diálogo?
  • Profile.getCurrentProfile () devuelve null después de iniciar sesión (FB API v4.0)
  • Finalizando un Cursor que no ha sido desactivado o cerrado error no fatal
  • 5 Solutions collect form web for “Detener el controlador después de que se haya destruido el fragmento”

    Necesitas implementar un manejador como este

     private Handler myHandler; private Runnable myRunnable = new Runnable() { @Override public void run() { //Do Something } }; @Override public void onDestroy () { mHandler.removeCallbacks(myRunnable); super.onDestroy (); } 

    Debe guardar una referencia a su manejador y ejecutarlo en el fragmento y, a continuación, cuando se destruya el fragmento, deberá eliminar las devoluciones de llamada del controlador que pasen al ejecutable.

     private Handler mHandler; private Runnable mRunnable; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //boilerplate code mRunnable = new Runnable() { @Override public void run() { assignAdapter(); handler.postDelayed(this, 15000); } }; mHandler = new Handler(mRunnable); mHandler.post(); return v; } @Override public void onDestroy() { mHandler.removeCallbacks(mRunnable); super.onDestroy(); } 

    Otra forma de detener el manejador con el uso de WeakReference al fragmento:

     static final class UpdateUIRunnable implements Runnable { final WeakReference<RouteGuideFragment> weakRefToParent; final Handler handler; public UpdateUIRunnable(RouteGuideFragment fragment, Handler handler) { weakRefToParent = new WeakReference<RouteGuideFragment>(fragment); this.handler = handler; } public void scheduleNextRun() { handler.postDelayed(this, INTERVAL_TO_REDRAW_UI); } @Override public void run() { RouteGuideFragment fragment = weakRefToParent.get(); if (fragment == null || fragment.hasBeenDestroyed()) { Log.d("UIUpdateRunnable", "Killing updater -> fragment has been destroyed."); return; } if (fragment.adapter != null) { try { fragment.adapter.forceUpdate(); } finally { // schedule again this.scheduleNextRun(); } } } } 

    Donde fragment.hasBeenDestroyed() es simplemente un getter para mDestroyed propiedad de un fragmento:

     @Override public void onDestroy() { super.onDestroy(); mDestroyed = true; } 

    Alguien publicó otra pregunta similar y el problema se debe a un error en el ChildFragmentManager . Básicamente, el ChildFragmentManager termina con un estado interno roto cuando se separa de la Activity . Echa un vistazo a la respuesta original aquí

    Utilice Rxjava, es mejor

     subscription = Observable.timer(1000, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(aLong -> whatToDo()); private void whatToDo() { System.out.println("Called after 1 second"); } 

    A continuación, en el método ondestroy ()

     RxUtils.unsubscribe(subscription); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.