【问题标题】:Where do I create and use ScheduledThreadPoolExecutor, TimerTask, or Handler?我在哪里创建和使用 ScheduledThreadPoolExecutor、TimerTask 或 Handler?
【发布时间】:2011-11-11 19:15:54
【问题描述】:

我需要让我的 RSS 提要阅读器每 10 分钟检查一次提要是否有新帖子,然后在有新帖子时解析它们。我还需要大约每分钟更新一次 UI。

我从不同的渠道阅读和听到了不同的东西。我目前的理解是我可以使用ScheduledThreadPoolExecutor 来制作两个预定线程,其中一个需要Handler 来更新UI。我不确定这些类或TimerTask 的最有效用途。

我也很不确定在哪里创建这些子类。一位朋友建议将TimerTask 扩展为我的FeedParser 类中的内部类,以使其更简单。但是,要以这种方式实现它,我必须对 TimerTask 使用 run() 方法而不覆盖它,这意味着我不能简单地使用需要运行的函数所需的参数。

简而言之,为此安排任务的最佳方式是什么,我将在哪里实施这些任务?

【问题讨论】:

    标签: android handler threadpool timertask scheduledexecutorservice


    【解决方案1】:

    我更喜欢使用 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() 中正确完成/关闭你的可运行任务,希望对你有所帮助。

    【讨论】:

    • 那么实际使用ScheduledExecutorService而不是ScheduledThreadPoolExecutor,这是前者的子类吗?还是只是我不需要ScheduledThreadPoolExecutor中的添加内容?
    • 如您所说,ScheduledThreadPoolExecutor 是一个 ScheduledExecutorService,使用哪个完全取决于您。
    • 非常有帮助的答案,你如何去“正确完成/关闭你的可运行任务”我发现的所有例子都使用了处理程序/计时器来完成这个和 removeCallbacks。有人知道 ScheduledThreadPoolExecutor 的流程吗?
    • 我正在尝试这种方法来执行周期性任务,但它似乎不起作用stackoverflow.com/questions/27872016/…
    • 非常感谢您的回答,为我工作。只是一个问题,是否可以暂停onPause() 中的 UI 更新以避免将大量 UI 更新排队(在我的情况下为 alertDialog)。
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多