在我的应用程序中,我使用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();
}
};
请告诉我应该如何以及在哪里禁用此帖子。
答案 0 :(得分:22)
你可以用它来阻止那个可运行的
handler.removeCallbacks(calendarUpdater);
removeCallbacks(Runnable r):删除邮件队列中Runnable r
的所有待处理帖子。
修改强>
您可以像这样整理代码
在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()
继承自以下链接
答案 1 :(得分:12)
尝试以下行,
handler.removeMessages(0);
删除邮件队列中代码为what
的所有待处理邮件。
答案 2 :(得分:8)
处理程序无法停止或启动。它只是一个将消息和Runnables发布到线程队列上的网关。在你的情况下,你发布了一个Runnable,它将在Handler的线程上运行。你必须停止Runnable。所以,检查一下for
循环来打破它。
您还可以Handler
使用removeCallbacks(Runnable r)
取消发布的Runnable
。但是这不会删除那些已经运行的Runnable
。
答案 3 :(得分:1)
你应该试试这个onStop()
:
handler.removeCallbacksAndMessages(calendarUpdater);
答案 4 :(得分:0)
使处理程序成为一个字段。然后在你的活动中,覆盖onStop方法并停止处理程序回调这样的消息:
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(calendarUpdater);
}