Где я могу создать и использовать ScheduledThreadPoolExecutor, TimerTask или Handler? - PullRequest
25 голосов
/ 11 ноября 2011

Мне нужно, чтобы мой читатель RSS-канала проверял канал каждые 10 минут на наличие новых сообщений, а затем анализировал их, если есть новые. Мне также нужно обновлять интерфейс каждую минуту.

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

Я также очень неуверен в том, где сделать их подклассы. Один из друзей предложил расширить TimerTask как внутренний класс в моем классе FeedParser, чтобы сделать его проще. Однако, чтобы реализовать его таким образом, я должен использовать метод run() для TimerTask, не переопределяя его, то есть я не могу просто использовать параметры, которые мне нужны для функций, которые необходимо запустить.

Короче говоря, каков наилучший способ запланировать задачи для этого, и где я бы их реализовал?

1 Ответ

53 голосов
/ 12 ноября 2011

Я предпочитаю использовать ScheduledThreadPoolExecutor. Как правило, если я правильно понимаю ваши требования, все они могут быть реализованы в вашей деятельности, TimerTask и Handler не нужны, см. Пример кода ниже:

public class MyActivity extends Activity {
  private ScheduledExecutorService scheduleTaskExecutor;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    scheduleTaskExecutor= Executors.newScheduledThreadPool(5);

    // This schedule a task to run every 10 minutes:
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
      public void run() {
        // Parsing RSS feed:
        myFeedParser.doSomething();

        // If you need update UI, simply do this:
        runOnUiThread(new Runnable() {
          public void run() {
            // update your UI component here.
            myTextView.setText("refreshed");
          }
        });
      }
    }, 0, 10, TimeUnit.MINUTES);
  } // end of onCreate()
}

Не забудьте правильно завершить / закрыть выполняемую задачу в Activity.onDestroy (), надеюсь, это поможет.

...