지정된 지연 후에 다음 메소드를 호출 할 수 있기를 원합니다. 목표 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);