Android에서 지연된 후 메소드를 호출하는 방법 다음과 같은 것이 있습니다. [self performSelector:@selector(DoSomething) withObject:nil afterDelay:5]; java와

지정된 지연 후에 다음 메소드를 호출 할 수 있기를 원합니다. 목표 c에는 다음과 같은 것이 있습니다.

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

java와 안드로이드 에서이 방법과 동등한 것이 있습니까? 예를 들어 5 초 후에 메소드를 호출 할 수 있어야합니다.

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



답변

코 틀린

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

자바

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


답변

내 경우에는 다른 답변을 사용할 수 없습니다. 대신 기본 Java 타이머를 사용했습니다.

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


답변

참고 : 이 답변은 질문에 Android를 컨텍스트로 지정하지 않았을 때 제공되었습니다. Android UI 스레드와 관련된 답변 은 여기를 참조하십시오.


Mac OS API가 현재 스레드를 계속 사용하고 작업이 비동기 적으로 실행되도록 예약하는 것처럼 보입니다. Java에서는 동등한 기능이 java.util.concurrent패키지에서 제공됩니다 . 안드로이드가 어떤 제한을 부과하는지 잘 모르겠습니다.

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

    }
});


답변

모든 훌륭한 답변에 감사드립니다. 내 요구에 가장 적합한 솔루션을 찾았습니다.

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


답변

Kotlin& Java여러 가지 방법

1. 사용 Handler

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

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

자바에서

1. 사용 Handler

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

2. 사용 Timer

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