2014-09-12 2 views
3

Пожалуйста, не помещайте это на удержание, пожалуйста, не отмечайте как дубликат и, пожалуйста, ответьте мне! Мне нужно, чтобы материал делался каждые 200 миллисекунд, и мне нужно, чтобы он был ровным и ровным. Задача - средний вес (в обоих случаях - вопрос 1 и 2). Поиск таймеров выглядит как лучшее решение сообщества - использовать обработчик, runnable и postDelayed(), (Android timer? How-to?).Андроид Таймер: postDelayed против расписания

Обновленные вопросы:

-Wich способ является наиболее точным и быстрым, если я должен взаимодействовать с пользовательским интерфейсом, postDelayed() или графика()/scheduleAtFixedRate()?

-Wich способ является наиболее точным и быстрым, если мне не нужно взаимодействовать с пользовательским интерфейсом, postDelayed() или schedule()/scheduleAtFixedRate()?

-Богие способы могут быть выполнены на основном процессе или на отдельном? как ?

Спасибо. Некоторые примеры ...

Таким образом, у меня есть локальные объекты mainclass, но это новый поток? Это хорошая оценка?

timer.schedule(new TimerTask() {   
     @Override 
     public void run() { 
        textview.setText(str); 
        //other stuff    
            } 
      }, 0, 200); 

Следующая еще одна с графиком, задача в отдельной задаче, а не сам таймер, я думаю, и я не могу взаимодействовать с UI directlly, я думаю ...

timer.schedule(new aclass(), 0, 200); 

Handler путь (от Dave.B):

Handler timerHandler = new Handler(); 
Runnable timerRunnable = new Runnable() { 
    @Override 
    public void run() { 
     TextView.setText(str); 
     // other stuff 
     timerHandler.postDelayed(this, 500); } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
... 
timerHandler.postDelayed(timerRunnable, 0); 
} 
+0

Если вы хотите, чтобы материал делался в основном потоке, используйте обработчик с 'postDelayed()'. В противном случае вы потеряете больше времени, разместив свое событие обратно в основной поток. –

+0

Таймер быстр, поэтому я полагаю, что мне нужен новый поток, но мне нужно взаимодействовать с UI. – Jackd

+0

В конце концов, я думаю, что плохо использовать обработчик (третий пример) в отдельном классе «помощник». И это должно поставить все на другое, правильно? – Jackd

ответ

5

Timer выполняет свои задачи в отдельном потоке, который используется только для обслуживания задач, созданных этим конкретным таймером. Handler выполняет свою задачу в своей ветке Looper, которая может быть или не быть нитью пользовательского интерфейса. Вообще говоря, нет большой разницы между этими двумя классами, если вы используете Handler в отдельном потоке. Но в Android более распространено использование Handler и HandlerThread.

Если вам нужно взаимодействовать с пользовательским интерфейсом, лучше использовать Handler в основном потоке, чтобы избежать переключения контекста. Но в этом случае могут быть некоторые задержки, поскольку производительность такого таймера будет зависеть от общей производительности пользовательского интерфейса.

ОБНОВЛЕНИЕ: В третьем примере на основной нити исполняется Runnable. Я предполагаю, что весь код в этом примере находится в подклассе Activity.

Handler, Timer и ScheduledExecutorService используют аналогичный подход к задачам планирования. Я не уверен, что вы можете добиться значительных изменений в точности или производительности при переходе от одной реализации к другой.

UPDATE: Наконец, я рекомендовал бы Вам следующий подход к выбору таймера:

  1. Используйте ScheduledExecutorService, если вам нужно задание выполнить в отдельном потоке или/и задача является слишком тяжелым для основной поток.
  2. Используйте Handler для выполнения задач в основном потоке или если вам нужна его функция очереди сообщений.
  3. Не используйте Timer, вместо этого используйте ScheduledExecutorService.
+0

Спасибо, Майкл. – Jackd

+0

Вопрос 1. Я думал, что задача и таймер должны быть в отдельном потоке (или я должен сказать об отдельном процессе? Цель состоит в том, чтобы не затормозить пользовательский интерфейс, как при любой тяжелой работе), также учитывая, что таймер i нужно быстро. – Jackd

+0

Question2: в третьем примере, который я добавил, это задача и вызов задачи на отдельный поток/процесс? – Jackd

1

Я предпочел бы использовать ScheduledThreadPoolExecutor, потому что таймер выполняет свою задачу последовательно, поэтому, если одновременно есть несколько задач, оставшиеся задачи будут отложены. В то время как ScheduledThreadPoolExecutor имеет пул потоков &, он позволяет запускать несколько задач параллельно, поэтому никакой задержки не будет.

Handler postdelayed method предназначен для отправки вашего запуска в основной поток пользовательского интерфейса в Android, вам это нужно для выполнения всего связанного с UI материала. Не следует путать таймер с обработчиком postdelayed

Edit 1: Для пользовательского интерфейса, связанные вещи вы можете использовать обработчик postdelayed. например

handler.postDelayed(new Runnable() { 
     public void run() { 
      textview.setText(str); 
      //other UI related stuff  
     } 
    }, 200); 
+0

Спасибо. У меня есть оба, связанный с UI и не связанный ... – Jackd

+0

отредактировал мой ответ для обработчика postdelayed. – Akhil

+0

Tnx ............ – Jackd

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