Timertask 또는 핸들러

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에서 Handlerover 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)


답변