2013-12-02 5 views
64

Предположим, что я хочу выполнить какое-либо действие каждые 10 секунд, и вам не обязательно обновлять представление.Timertask или Handler

вопрос: не является ли это лучше (я имею в виду более эффективное и действенное), чтобы использовать таймер с 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); 

Также я хотел будьте благодарны, если вы сможете объяснить, когда использовать какой подход и почему один из них более эффективен, чем другой (если это действительно так).

+1

Я прочитал много сообщений о нерегулярном поведении TimerTasks.Мой совет будет избегать их и использовать подход handler/postDelayed. –

+1

Я бы предпочел метод Handler-postDelay - у вас больше контроля, и вы планируете его изнутри – mihail

+1

Вот отличный источник для [Timer vs. Handler] (http://androidtrainningcenter.blogspot.in/2013/12/ handler-vs-timer-fixed-period-execution.html) – CodyF

ответ

15

Есть некоторые недостатки использования таймера

Это создает только один поток для выполнения задачи, и если задача занимает слишком долго, чтобы бежать, другие задачи, страдают. Он не обрабатывает исключения брошенные задач и нить просто заканчивается, который влияет на другие запланированные задачи, и они никогда не запускать

Скопировано из:

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

+4

так что о задачах с одним выстрелом? это похоже на то, что Timer лучше для этого, потому что у вас нет накладных расходов на очередь сообщений? – Michael

39

Handler лучше TimerTask.

Java TimerTask и Android Handler оба позволяют планировать отложенные и повторяющиеся задачи по фоновым потокам. Однако в литературе в подавляющем большинстве случаев рекомендует использовать Handler над TimerTask в Android (см here, here, here, here, here и here).

Некоторые из сообщенных проблем с TimerTask включают в себя:

  • Невозможно обновить поток пользовательского интерфейса
  • утечки памяти
  • подействовать (не всегда работает)
  • Длинные погонных задачи могут помешать следующее запланированное мероприятие

Пример

Лучший источник для всех видов 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); 

Связанных

+0

Нужно ли нам убрать обработчик в какой-то момент? – Reek

+3

@Reek Нет, GC должен позаботиться об этом. Но вам нужно позаботиться о том, что runnable отправлен для отложенного выполнения. В приведенном выше примере используемый runnable - это внутренний экземпляр класса, поэтому он содержит неявную ссылку на содержащий класс (который может быть активным). Runnable останется в очереди сообщений связанного с обработчиком обработчика до тех пор, пока его следующее время выполнения, которое может быть после контекста недействительным, и может пропустить экземпляр содержащего класса. Вы можете очистить такие ссылки с помощью 'mHandler.removeCallbacks (runnableCode)' в соответствующее время (например, 'onStop()' для активности). – bitbybit

+0

Лучший способ представления ссылок когда-либо !!! (см. здесь, здесь, здесь, здесь, здесь и здесь). –

Смежные вопросы