15

在我的应用程序中,我使用 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();
    }
};

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

4

5 回答 5

26

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

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()

继承自以下链接

重复一个有时间延迟的任务?

于 2013-01-28T07:29:57.917 回答
12

试试下面的线,

handler.removeMessages(0);

what使用消息队列中的代码删除任何待处理的消息帖子。

于 2013-01-28T07:30:14.987 回答
9

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

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

于 2013-01-28T07:29:27.157 回答
2

你应该试试这个onStop()

handler.removeCallbacksAndMessages(calendarUpdater);
于 2017-12-23T15:06:38.937 回答
1

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

@Override
    protected void onStop() {
        super.onStop();
        handler.removeCallbacks(calendarUpdater);
    }
于 2017-08-22T11:41:41.097 回答