如何在Android中停止处理程序
在我的应用程序中,我使用Gridview创建了一个日历,在该Gridview中,我在Imageview的帮助下显示日期和一些事件的可用性,为此,我创建了一个处理程序 现在我要停止处理程序 MainActivity.java如何在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
// 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);