我希望能在指定的延迟时间后调用下面的方法。 在Objective-C中,有一个类似于以下代码的方法:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
在安卓Java中是否有此方法的等效方法?例如,我需要在5秒后调用一个方法。
public void DoSomething()
{
//do something here
}
Handler(Looper.getMainLooper()).postDelayed({
//Do something after 100ms
}, 100)
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 100);
需要导入的类是 android.os.handler
。
在我的情况下,我无法使用其他任何答案。我使用了本地的Java定时器。
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// this code will be executed after 2 seconds
}
}, 2000);
注意: 当时问题没有指定Android作为上下文,因此给出的这个答案并不特指于Android UI线程。有关特定于Android的UI线程的答案,请在这里查看。
看起来Mac OS API允许当前线程继续执行,并安排任务以异步方式运行。在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);
⋮
}
worker.schedule()
返回的ScheduledFuture <?>
的引用,并调用其cancel(boolean)
方法即可。 - DennisScheduledExecutorService
中的一个方法。 - erickson在5秒后在UI线程执行某个操作:
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
//Do something here
}
}, 5000);
Kotlin
与Java
多种方式
Handler
Handler().postDelayed({
TODO("Do something")
}, 2000)
Timer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
甚至可以更短
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
最短的方式是:
Timer().schedule(2000) {
TODO("Do something")
}
Executors
Executors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
在Java中
Handler
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something
}
}, 2000);
Timer
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// Do something
}
}, 2000);
ScheduledExecutorService
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
Runnable runnable = new Runnable() {
public void run() {
// Do something
}
};
worker.schedule(runnable, 2, TimeUnit.SECONDS);
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//add your code here
}
}, 1000);
}
});
感谢所有的好答案,我找到了最适合我的解决方案。
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
}
}
大多数答案使用 Handler,但我提供了一种不同的解决方案来处理活动、片段和视图模型中的延迟,使用 Android 生命周期扩展。 这种方法在生命周期销毁时会自动取消,避免内存泄漏或应用崩溃
在活动或片段中:
lifecycleScope.launch {
delay(DELAY_MS)
doSomething()
}
在ViewModel中:
viewModelScope.lanch {
delay(DELAY_MS)
doSomething()
}
suspend fun doSomethingAfter(){
delay(DELAY_MS)
doSomething()
}
如果你在使用lifecycleScope时出现找不到的错误!-请将此依赖项导入应用程序的 gradle 文件中:
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"
请看这个演示:
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?");
}
}
如果你必须使用 Handler,但是却在另一个线程中,你可以使用 runonuithread
在 UI 线程中运行 Handler。这样可以避免出现需要调用 Looper.Prepare()
抛出的异常。
runOnUiThread(new Runnable() {
@Override
public void run() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 1 second
}
}, 1000);
}
});
看起来很凌乱,但这是其中一种方法。
removeCallbacks(Runnable r)
来取消执行。 - Dennisnew Handler().postDelayed(() -> { //100毫秒后执行某些操作 }, 100);
- Choletski