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.

  • Android ANTLR hacer que no funciona correctamente
  • Cómo crear calendario simple en android
  • DataBinding: ¿Cómo obtener el recurso por id dinámico?
  • Cordova 4.3.0 Error: Instala Android target: "android-21"
  • ¿Por qué Google eligió RenderScript en lugar de OpenCL
  • Método retrofit 2.0 sin respuesta
  •  @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.

  • Si ya tengo ACCESS_FINE_LOCATION, ¿puedo omitir ACCESS_COARSE_LOCATION?
  • Es SharedPreferences tiempo de acceso?
  • ¿Cómo configuro el emulador de Android 4.0+ para que se comporte como una tableta?
  • ¿Agregar un nuevo elemento a recyclerview de forma programática?
  • Error de compilación del código fuente de Android: "Intente aumentar el tamaño del montón con la opción de java" -Xmx <size> ""
  • ¿Cómo obtener el recuento de líneas de textview antes de renderizar?
  • 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.