Programing

Timertask 또는 핸들러

crosscheck 2020. 8. 31. 07:14
반응형

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

관련


There are some disadvantages of using Timer

It creates only single thread to execute the tasks and if a task takes too long to run, other tasks suffer. It does not handle exceptions thrown by tasks and thread just terminates, which affects other scheduled tasks and they are never run

Copied from:

TimerTask vs Thread.sleep vs Handler postDelayed - most accurate to call function every N milliseconds?


Kotlin version of accepted answer:

val handler = Handler()

val runnableCode = object : Runnable {
    override fun run() {
       Log.d("Handlers", "Called on main thread")
       handler.postDelayed(this, 2000)
    }
}

handler.post(runnableCode)

참고URL : https://stackoverflow.com/questions/20330355/timertask-or-handler

반응형