如何在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() 之后时,它不会事件开始 我可以“删除”running Runnable吗?【参考方案3】:

试试下面一行,

handler.removeMessages(0);

删除消息队列中代码为what 的所有待处理消息。

【讨论】:

【参考方案4】:

使处理程序成为一个字段。然后在您的活动中,覆盖 onStop 方法并停止处理程序回调消息,如下所示:

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

【讨论】:

【参考方案5】:

你应该试试这个onStop()

handler.removeCallbacksAndMessages(calendarUpdater);

【讨论】:

评论质量答案。

以上是关于如何在Android中停止处理程序的主要内容,如果未能解决你的问题,请参考以下文章

应用程序空闲时如何在android中停止GPS更新?

如何在 Java Android 中停止程序 1 秒? [复制]

当android应用程序后台运行时如何在android中隐藏视图(在后台运行时不停止android拍摄快照)[重复]

android服务如何对未处理的异常做出反应?

Android:如何停止这种音乐?

Android:如何停止/清除我的 Android 小部件应用程序的缓存后台进程?