Android: ejecuta un método periódicamente usando la llamada postDelayed ()



Answers

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      @Override
      public void run() {
        //Do something after 100ms
        Toast.makeText(c, "check", Toast.LENGTH_SHORT).show();  
        handler.postDelayed(this, 2000);
      }
    }, 1500);
Question

Tengo una situación en una aplicación de Android en la que quiero iniciar una actividad de red (envío de algunos datos) que debe ejecutarse cada segundo. Lo logro de la siguiente manera:

En el onCreate() tengo el código:

tv = new TextView(this);
tv.postDelayed(sendData, 1000);

La función sendData() :

   Handler handler = new Handler();
   private Runnable sendData=new Runnable(){
    public void run(){
        try {
            //prepare and send the data here..
            handler.removeCallbacks(sendData);
            handler.postDelayed(sendData, 1000);    
        }
        catch (Exception e) {
            e.printStackTrace();
        }   
    }
};

El problema viene así: cuando el usuario presiona los botones de retroceso y la aplicación sale (la IU desaparece) la función sendData() aún se ejecuta, que es lo que quiero. Ahora cuando el usuario reinicia la aplicación, mi onCreate() vuelve a llamar y obtengo sendData() invocado dos veces por segundo. Sigue así. Cada vez que el usuario sale y comienza de nuevo, se sendData() un sendData() por segundo.

¿Qué estoy haciendo mal? ¿Es mi new Handler() creando un problema? ¿Cuál es la mejor manera de manejar esto? Deseo una llamada a sendData() por segundo hasta que el usuario salga de la aplicación (administrador de la aplicación de formulario).




Puedes simplificar el código de esta manera.

Solo escribe:

final Handler handler = new Handler();
handler.postDelayed (() -> {
    //your code here
}, TIME_DELAY);



Debe establecer andrid: allowRetainTaskState = "true" para iniciar la actividad en Manifest.xml. Si esta actividad no es actividad de lanzamiento. deberías configurar android: launchMode = "singleTask" en esta actividad




Handler h = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (msg.what==0){
            // do stuff
            h.removeMessages(0);  // clear the handler for those messages with what = 0
            h.sendEmptyMessageDelayed(0, 2000); 
        }
    }
};


 h.sendEmptyMessage(0);  



Links