如何在Android中停止处理程序

Abh*_*man 14 android handler runnable

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

请告诉我应该如何以及在哪里禁用此线程.

Jun*_*ned 26

您可以使用它来停止该runnable

handler.removeCallbacks(calendarUpdater);
Run Code Online (Sandbox Code Playgroud)

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

编辑

您可以像这样组织代码

在onCreate of 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);
}
Run Code Online (Sandbox Code Playgroud)

现在您可以打电话MainActivity.java发布消息并停止使用startRepeatingTask()

继承自以下链接

有时间延迟重复一项任务?


Mur*_*san 12

试试以下行,

handler.removeMessages(0);

what使用邮件队列中的代码删除所有待处理的邮件帖子.


S.D*_*.D. 8

处理程序无需停止启动.它只是一个将消息和Runnables发布到线程队列上的网关.在你的情况下,你发布了一个Runnable,它将在Handler的线程上运行.你必须停止Runnable.所以,检查一下这个for循环来打破它.

你也可以使用removeCallbacks(Runnable r)on Handler来取消发布Runnable的.但这不会删除Runnable已经运行的那些.