如何在Android中停止处理程序
Posted
技术标签:
【中文标题】如何在Android中停止处理程序【英文标题】:How to stop Handler in Android 【发布时间】:2013-01-11 12:20:06 【问题描述】:在我的应用程序中,我使用 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();
;
请告诉我应该如何以及在何处禁用此线程。
【问题讨论】:
【参考方案1】:处理程序没有什么要停止或启动。它只是将消息和 Runnables 发布到线程队列的网关。在您的情况下,您发布了一个 Runnable,它将在 Handler 的线程上运行。你必须停止那个 Runnable。因此,请检查 for
循环以打破它。
您也可以在Handler
上使用removeCallbacks(Runnable r)
取消已发布的Runnable
。但这不会删除那些已经在运行的Runnable
。
【讨论】:
【参考方案2】:您可以使用它来停止该可运行文件
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()
继承自以下链接
Repeat a task with a time delay?
【讨论】:
这段代码放在哪里?当我将此代码放在 handler.post() 之后时,它不会事件开始 我可以“删除”runningRunnable
吗?【参考方案3】:
试试下面一行,
handler.removeMessages(0);
删除消息队列中代码为what
的所有待处理消息。
【讨论】:
【参考方案4】:使处理程序成为一个字段。然后在您的活动中,覆盖 onStop 方法并停止处理程序回调消息,如下所示:
@Override
protected void onStop()
super.onStop();
handler.removeCallbacks(calendarUpdater);
【讨论】:
【参考方案5】:你应该试试这个onStop()
:
handler.removeCallbacksAndMessages(calendarUpdater);
【讨论】:
评论质量答案。以上是关于如何在Android中停止处理程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java Android 中停止程序 1 秒? [复制]