如何在Android中停止处理程序

如何在Android中停止处理程序,android,handler,runnable,Android,Handler,Runnable,在我的应用程序中,我使用Gridview创建了一个日历,在该Gridview中,我在Imageview的帮助下显示日期和一些事件的可用性,为此,我创建了一个处理程序 现在我要停止处理程序 MainActivity.java // inside oncreate Handler handler = new Handler(); refreshCalendar(); // outside oncreate public void refreshCalendar() { calAdap

在我的应用程序中,我使用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();
    }
};
//内部oncreate
Handler=newhandler();
刷新日历();
//外部oncreate
公共日历(){
calAdapter.refreshDays();
calAdapter.notifyDataSetChanged();
handler.post(日历更新程序);
calTitle.setText(android.text.format.DateFormat.format(“MMMM-yyyy”,cal));
}
public Runnable calendarUpdater=new Runnable(){
@凌驾
公开募捐{
items.clear();
allData=newarraylist();
allData.clear();
allData=db.showAllEvents();
字符串currentDate=(字符串)android.text.format.DateFormat.format(“MM/yyyy”,cal);
for(int i=0;i处理程序无需停止或启动。它只是一个将消息和可运行项发布到线程队列的网关。在您的情况下,您正在发布一个可运行项,该可运行项将在处理程序的线程上运行。您必须停止该可运行项。因此,在
for
循环中进行检查以中断它


您还可以在
处理程序上使用来取消已发布的
可运行的
。但这不会删除那些已运行的
可运行的

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

handler.removeCallbacks(calendarUpdater);
removeCallbacks(Runnable r):删除消息队列中的
Runnable r
的所有挂起帖子

编辑

您可以这样组织代码

MainActivity.java的
onCreate()

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);
}
Handler=newhandler();
刷新日历()
//外部oncreate
公共日历(){
calAdapter.refreshDays();
calAdapter.notifyDataSetChanged();
startRepeatingTask();
calTitle.setText(android.text.format.DateFormat.format(“MMMM-yyyy”,cal));
}
public Runnable calendarUpdater=new Runnable(){
@凌驾
公开募捐{
items.clear();
allData=newarraylist();
allData.clear();
allData=db.showAllEvents();
字符串currentDate=(字符串)android.text.format.DateFormat.format(“MM/yyyy”,cal);
对于(int i=0;i

请在下面的行中尝试

handler.removeMessages(0)


删除消息队列中所有代码为
what
的消息的挂起帖子。

将处理程序设为字段。然后在活动中,重写onStop方法并停止处理程序回调消息,如下所示:

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

您应该在顶部()上尝试此


将此代码放在何处?当我将此代码放在handler.post()之后时,它不会启动事件。我可以“删除”正在运行的
Runnable
?注释质量答案。
handler.removeCallbacksAndMessages(calendarUpdater);