如何在Android中延迟后调用方法

我想在指定的延迟之后能够调用下面的方法。 在目标c中有这样的东西:

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

有没有在Java与Android的这种方法的等价物? 例如,我需要能够在5秒后调用一个方法。

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

更好的版本:

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

在我的情况下,我不能使用任何其他的答案。 我使用了原生的java Timer。

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

注意:当问题没有指定Android作为上下文时,给出了这个答案。 对于特定于Android UI线程的回答, 请看这里。


它看起来像Mac OS API让当前线程继续,并安排任务asynchronous运行。 在Java中,等价函数由java.util.concurrent包提供。 我不确定Android可能施加的限制。

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

在5秒后在UI线程中执行某些东西:

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

你可以在UIThread里面使用Handler:

 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); } }); 

感谢所有伟大的答案,我find了最适合我需求的解决scheme。

 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 } } 

如果你必须使用处理程序,但是你进入另一个线程,你可以使用runonuithread在UI线程中运行处理程序。 这将节省您从抛出exception请求调用Looper.Prepare()

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

看起来相当混乱,但这是其中之一。

看这个演示:

 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?"); } } 

我更喜欢使用View.postDelayed()方法,下面是简单的代码:

 mView.postDelayed(new Runnable() { @Override public void run() { // Do something after 1000 ms } }, 1000); 
 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); 

这是我最短的解决scheme:

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

我build议定时器 ,它可以让你安排一个非常特定的时间间隔的方法。 这不会阻止你的用户界面,并保持你的应用程序正在执行的方法。

另一个选项是wait(); 方法,这将阻塞当前线程达指定的时间长度。 这将导致您的用户界面停止响应,如果你在UI线程上这样做。

我创build了更简单的方法来调用它。

 public static void CallWithDelay(long miliseconds, final Activity activity, final String methodName) { new Handler().postDelayed(new Runnable() { @Override public void run() { try { Method method = activity.getClass().getMethod(methodName); method.invoke(activity); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }, miliseconds); } 

要使用它,只需调用: .CallWithDelay(5000, this, "DoSomething");

如果您使用的是Android Studio 3.0及更高版本,则可以使用lambdaexpression式。 callMyMethod()方法在2秒后被调用:

 new Handler().postDelayed(() -> callMyMethod(), 2000); 

如果您需要取消所有延迟的可运行程序:

 Handler handler = new Handler(); handler.postDelayed(() -> callMyMethod(), 2000); // When you need to cancel all your posted runnables just use: handler.removeCallbacksAndMessages(null); 

使用CountDownTimer非常简单。 有关更多详细信息, 请参阅https://developer.android.com/reference/android/os/CountDownTimer.html

 import android.os.CountDownTimer; // calls onTick every second, finishes after 3 seconds new CountDownTimer(3000, 1000) { public void onTick(long millisUntilFinished) { Log.d("log", millisUntilFinished / 1000); } public void onFinish() { // called after count down is finished } }.start(); 

这是另一个棘手的方法:当可运行的UI元素运行时不会抛出exception。

 public class SimpleDelayAnimation extends Animation implements Animation.AnimationListener { Runnable callBack; public SimpleDelayAnimation(Runnable runnable, int delayTimeMilli) { setDuration(delayTimeMilli); callBack = runnable; setAnimationListener(this); } @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { callBack.run(); } @Override public void onAnimationRepeat(Animation animation) { } 

}

你可以这样调用animation:

  view.startAnimation(new SimpleDelayAnimation(delayRunnable, 500)); 

animation可以附加到任何视图。

你可以通过使用新引入的lambdaexpression式来使它更清晰:

  new Handler().postDelayed(() -> {/*your code here*/}, time); 

android中的一个合适的解决scheme

 private static long SLEEP_TIME = 2 // for 2 second . . MyLauncher launcher = new MyLauncher(); launcher.start(); . . private class MyLauncher extends Thread { @Override /** * Sleep for 2 seconds as you can also change SLEEP_TIME 2 to any. */ public void run() { try { // Sleeping Thread.sleep(SLEEP_TIME * 1000); } catch (Exception e) { Log.e(TAG, e.getMessage()); } //do something you want to do //And your code will be executed after 2 second } } 

每个人似乎忘记清理处理程序,然后发布一个新的可运行或消息。 否则他们可能会积累并造成不良行为。

 handler.removeMessages(int what); // Remove any pending posts of messages with code 'what' that are in the message queue. handler.removeCallbacks(Runnable r) // Remove any pending posts of Runnable r that are in the message queue.