Pregunta Cómo llamar a un método después de un retraso en Android


Deseo poder llamar al siguiente método después de un retraso especificado.  En el objetivo c había algo así como:

[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];

¿Hay un equivalente de este método en Android con Java? Por ejemplo, necesito poder llamar a un método después de 5 segundos.

public void DoSomething()
{
     //do something here
}

574
2018-06-18 18:24


origen


Respuestas:


Mejor versión:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

1469
2018-02-06 19:55



No podría usar ninguna de las otras respuestas en mi caso. Usé el Timer nativo de Java en su lugar.

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // this code will be executed after 2 seconds       
    }
}, 2000);

258
2018-06-23 01:16



Nota: Esta respuesta se dio cuando la pregunta no especificaba Android como el contexto. Para una respuesta específica al hilo de la interfaz de usuario de Android mira aquí.


Parece que la API de Mac OS permite que el hilo actual continúe y programa la tarea para que se ejecute de forma asíncrona. En Java, la función equivalente es proporcionada por java.util.concurrent paquete. No estoy seguro de las limitaciones que Android podría imponer.

private static final ScheduledExecutorService worker = 
  Executors.newSingleThreadScheduledExecutor();

void someMethod() {
  ⋮
  Runnable task = new Runnable() {
    public void run() {
      /* Do something… */
    }
  };
  worker.schedule(task, 5, TimeUnit.SECONDS);
  ⋮
}

177
2018-06-18 18:51



Para ejecutar algo en el hilo de UI después de 5 segundos:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something here
    }
}, 5000);

89
2018-01-27 15:22



puede usar Handler dentro de UIThread:

runOnUiThread(new Runnable() {

    @Override
    public void run() {
         final Handler handler = new Handler();
         handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               //add your code here
           }
         }, 1000);

    }
});

35
2018-03-22 01:57



Gracias por todas las excelentes respuestas, encontré la solución que mejor se adapta a mis necesidades.

Handler myHandler = new DoSomething();
Message m = new Message();
m.obj = c;//passing a parameter here
myHandler.sendMessageDelayed(m, 1000);

class DoSomething extends Handler {
    @Override
    public void handleMessage(Message msg) {
      MyObject o = (MyObject) msg.obj;
      //do something here
    }
}

34
2018-06-18 19:28



Si tiene que usar el controlador, pero está en otro hilo, puede usar runonuithread ejecutar el controlador en el subproceso de interfaz de usuario. Esto te salvará de las Excepciones lanzadas al solicitar una llamada Looper.Prepare()

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 1 second
            }
        }, 1000);
    }
});

Parece bastante complicado, pero este es uno de los caminos.


19
2018-02-04 08:47



Vea esta demostración:

import java.util.Timer;
import java.util.TimerTask;

class Test {
     public static void main( String [] args ) {
          int delay = 5000;// in ms 

          Timer timer = new Timer();

          timer.schedule( new TimerTask(){
             public void run() { 
                 System.out.println("Wait, what..:");
              }
           }, delay);

           System.out.println("Would it run?");
     }
}

18
2018-06-18 18:45



Prefiero usar View.postDelayed() método, código simple a continuación:

mView.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 1000 ms
    }
}, 1000);

14
2018-05-14 15:49



Aquí está mi solución más corta:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //Do something after 100ms
    }
}, 100);

11
2018-01-29 14:41



final Handler handler = new Handler(); 
Timer t = new Timer(); 
t.schedule(new TimerTask() { 
    public void run() { 
        handler.post(new Runnable() { 
            public void run() { 
                //DO SOME ACTIONS HERE , THIS ACTIONS WILL WILL EXECUTE AFTER 5 SECONDS...
            }
        }); 
    } 
}, 5000); 

9
2018-06-09 06:08