我希望能够在指定的延迟后调用以下方法。 在objective c中,有这样的东西:

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

在android和java中是否有类似的方法? 例如,我需要能够在5秒后调用一个方法。

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

当前回答

Kotlin & Java多种方式

1. 使用处理程序

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. 使用TimerTask

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

或者更短

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

或者说最短的是

Timer().schedule(2000) {
    TODO("Do something")
}

3.使用执行人

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

在Java中

1. 使用处理程序

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

2. 使用定时器

new Timer().schedule(new TimerTask() {          
    @Override
    public void run() {
        // Do something
    }
}, 2000);

3.使用ScheduledExecutorService

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

Runnable runnable = new Runnable() {
  public void run() {
      // Do something
  }
  };
worker.schedule(runnable, 2, TimeUnit.SECONDS);

其他回答

科特林

Handler(Looper.getMainLooper()).postDelayed({
    //Do something after 100ms
}, 100)

Java

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

要导入的类是android.os.handler。

类似的解决方案,但使用起来更干净

把这个函数写在类的外面

fun delay(duration: Long, `do`: () -> Unit) {

    Handler().postDelayed(`do`, duration)

}

用法:

delay(5000) {
    //Do your work here
}

你可以使用新引入的lambda表达式让它更简洁:

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

更安全-与Kotlin协程

大多数答案使用Handler,但我给出了一个不同的解决方案来延迟活动,片段,视图模型与Android Lifecycle ext.这种方式将自动取消生命周期开始破坏-避免泄漏内存或崩溃的应用程序

在活动或片段中:

lifecycleScope.launch { 
  delay(DELAY_MS)
  doSomething()
}

在ViewModel:

viewModelScope.lanch {
  delay(DELAY_MS)
  doSomething()
}

在挂起函数:(Kotlin协程)

suspend fun doSomethingAfter(){
    delay(DELAY_MS)
    doSomething()
}

如果您得到一个错误,lifecycleScope没有找到!-将这个依赖导入到应用的gradle文件中:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.4.0"

低于1的情况下,

runtimeexception:不能在线程内部创建处理程序 没有调用loop .prepare()

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