10 초마다 몇 가지 작업을 수행하고 싶고 뷰를 업데이트 할 필요가 없다고 가정 해 보겠습니다.
질문은 다음과 같이 timertask와 함께 타이머를 사용하는 것이 더 낫습니까 (더 효율적이고 효과적이라는 의미입니다).
final Handler handler = new Handler();
TimerTask timertask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
<some task>
}
});
}
};
timer = new Timer();
timer.schedule(timertask, 0, 15000);
}
또는 postdelayed가있는 핸들러
final Handler handler = new Handler();
final Runnable r = new Runnable()
{
public void run()
{
<some task>
}
};
handler.postDelayed(r, 15000);
또한 어떤 접근 방식을 사용해야하는지, 왜 그중 하나가 다른 접근 방식보다 더 효율적인지 설명해 주시면 감사하겠습니다.
답변
Handler
보다 낫습니다 TimerTask
.
Java TimerTask
와 Android Handler
모두 백그라운드 스레드에서 지연 및 반복 작업을 예약 할 수 있습니다. 그러나 문헌 은 Android에서 Handler
over TimerTask
를 사용 하는 것을 압도적으로 권장합니다 ( here , here , here , here , here , here 참조 ).
TimerTask와 관련하여보고 된 문제 중 일부는 다음과 같습니다.
- UI 스레드를 업데이트 할 수 없습니다.
- 메모리 누수
- 신뢰할 수 없음 (항상 작동하지는 않음)
- 오래 실행되는 작업은 다음 예약 된 이벤트를 방해 할 수 있습니다.
예
내가 본 모든 종류의 Android 예제에 대한 최고의 소스는 Codepath 입니다. 다음은 Handler
반복되는 작업에 대한 예입니다.
// Create the Handler object (on the main thread by default)
Handler handler = new Handler();
// Define the code block to be executed
private Runnable runnableCode = new Runnable() {
@Override
public void run() {
// Do something here on the main thread
Log.d("Handlers", "Called on main thread");
// Repeat this the same runnable code block again another 2 seconds
handler.postDelayed(runnableCode, 2000);
}
};
// Start the initial runnable task by posting through the handler
handler.post(runnableCode);
관련
답변
타이머 사용에는 몇 가지 단점이 있습니다.
작업을 실행하기 위해 단일 스레드 만 생성하고 작업을 실행하는 데 너무 오래 걸리면 다른 작업이 어려움을 겪습니다. 작업에서 발생한 예외를 처리하지 않고 스레드가 종료되어 다른 예약 된 작업에 영향을 미치며 실행되지 않습니다.
복사 출처 :
TimerTask vs Thread.sleep vs Handler postDelayed-N 밀리 초마다 함수를 호출하는 것이 가장 정확합니까?
답변
수락 된 답변의 Kotlin 버전 :
val handler = Handler()
val runnableCode = object : Runnable {
override fun run() {
Log.d("Handlers", "Called on main thread")
handler.postDelayed(this, 2000)
}
}
handler.post(runnableCode)