【问题标题】:How to stop Handler in Android如何在Android中停止处理程序
【发布时间】:2013-01-11 12:20:06
【问题描述】:

在我的应用程序中,我使用 Gridview 创建了一个日历,在该 Gridview 中,我在 Imageview 的帮助下显示日期和一些事件的可用性,为此我创建了一个处理程序。

现在我想停止处理程序。

MainActivity.java

// inside oncreate

Handler handler = new Handler();
refreshCalendar();

// outside oncreate

public void refreshCalendar() { 
    calAdapter.refreshDays();
    calAdapter.notifyDataSetChanged();
    handler.post(calendarUpdater);
    calTitle.setText(android.text.format.DateFormat.format("MMMM yyyy", cal));
}
public Runnable calendarUpdater = new Runnable() {

    @Override
    public void run() {
        items.clear();
        allData = new ArrayList<HashMap<String,String>>();
        allData.clear();
        allData = db.showAllEvents();

        String currentDate = (String)android.text.format.DateFormat.format("MM/yyyy", cal);
        for(int i=0; i<allData.size(); i++)
        {
            String date[] = allData.get(i).get("date").split("/");
            String md[] = currentDate.split("/");
            if(date[1].equals(md[0]) && date[2].equals(md[1]))
            {
                items.add(date[0]);
                System.out.println("dates: "+date[0]);
            }
        }
        calAdapter.setItems(items);
        calAdapter.notifyDataSetChanged();
    }
};

请告诉我应该如何以及在何处禁用此线程。

【问题讨论】:

    标签: android handler runnable


    【解决方案1】:

    处理程序没有什么要停止启动。它只是将消息和 Runnables 发布到线程队列的网关。在您的情况下,您发布了一个 Runnable,它将在 Handler 的线程上运行。你必须停止那个 Runnable。因此,请检查 for 循环以打破它。

    您也可以在Handler 上使用removeCallbacks(Runnable r) 取消已发布的Runnable。但这不会删除那些已经在运行的Runnable

    【讨论】:

      【解决方案2】:

      您可以使用它来停止该可运行文件

      handler.removeCallbacks(calendarUpdater);
      

      removeCallbacks(Runnable r) :删除消息队列中Runnable r 的所有待处理帖子。

      编辑

      你可以这样组织你的代码

      在您的onCreate()MainActivity.java

      Handler handler = new Handler();
      refreshCalendar()
      
      //outside  oncreate 
      
      public void refreshCalendar() { 
          calAdapter.refreshDays();
          calAdapter.notifyDataSetChanged();
          startRepeatingTask();
          calTitle.setText(android.text.format.DateFormat.format("MMMM yyyy", cal));
      }
      
      public Runnable calendarUpdater = new Runnable() {
      
          @Override
          public void run() {
              items.clear();
              allData = new ArrayList<HashMap<String,String>>();
              allData.clear();
              allData = db.showAllEvents();
      
              String currentDate = (String)android.text.format.DateFormat.format("MM/yyyy", cal);
              for(int i=0; i<allData.size(); i++)
              {
                  String date[] = allData.get(i).get("date").split("/");
                  String md[] = currentDate.split("/");
                  if(date[1].equals(md[0]) && date[2].equals(md[1]))
                  {
                      items.add(date[0]);
                      System.out.println("dates: "+date[0]);
                  }
              }
              calAdapter.setItems(items);
              calAdapter.notifyDataSetChanged();
              handler.postDelayed(calendarUpdater,5000); // 5 seconds
          }
      };
      
      void startRepeatingTask()
      {
          calendarUpdater.run(); 
      }
      
      void stopRepeatingTask()
      {
          handler.removeCallbacks(calendarUpdater);
      }
      

      现在您只需拨打startRepeatingTask() 发布消息并停止使用stopRepeatingTask()

      继承自以下链接

      Repeat a task with a time delay?

      【讨论】:

      • 这段代码放在哪里?当我将此代码放在 handler.post() 之后时,它不会事件开始
      • 我可以“删除”running Runnable吗?
      【解决方案3】:

      试试下面一行,

      handler.removeMessages(0);

      删除消息队列中代码为what 的所有待处理消息。

      【讨论】:

        【解决方案4】:

        使处理程序成为一个字段。然后在您的活动中,覆盖 onStop 方法并停止处理程序回调消息,如下所示:

        @Override
            protected void onStop() {
                super.onStop();
                handler.removeCallbacks(calendarUpdater);
            }
        

        【讨论】:

          【解决方案5】:

          你应该试试这个onStop()

          handler.removeCallbacksAndMessages(calendarUpdater);
          

          【讨论】:

          • 评论质量答案。
          猜你喜欢
          • 2013-04-03
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          相关资源
          最近更新 更多