web-dev-qa-db-ja.com

ScheduledThreadPoolExecutor、TimerTask、またはHandlerはどこで作成して使用しますか?

RSSフィードリーダーに10分ごとにフィードをチェックさせて新しい投稿を確認し、新しい投稿がある場合はそれらを解析する必要があります。また、UIを約1分ごとに更新する必要があります。

私はさまざまな情報源からさまざまなことを読んだり聞いたりしました。私の現在の理解では、ScheduledThreadPoolExecutorを使用して2つのスケジュールされたスレッドを作成でき、そのうちの1つはUIを更新するためにHandlerが必要です。これらのクラスまたはTimerTaskの最も効率的な使用法がわかりません。

また、これらのサブクラスをどこで作成するかについても非常に不確かです。ある友人は、TimerTaskを私のFeedParserクラスの内部クラスとして拡張して簡単にすることを提案しました。ただし、そのように実装するには、TimerTaskrun()メソッドをオーバーライドせずに使用する必要があります。つまり、必要な関数に必要なパラメーターを単純に使用することはできません。実行します。

要するに、このためのタスクをスケジュールするための最良の方法は何ですか、そして私はこれらをどこに実装しますか?

25
zr00

私は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()で実行可能なタスクを適切に終了/閉じることを忘れないでください。それがお役に立てば幸いです。

53
yorkw