如何在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.