2

我编写了一个处理程序,它在每个时间间隔调用该方法。我想在 destroy() 中删除该处理程序。我使用的代码如下,在 Oncreate()

private final Handler _handler = new Handler();
public int DATA_INTERVAL = 30 * 1000;
Runnable getData;
 getData = new Runnable()
        {
            @Override
            public void run()
            {
                     recieveData();
            }
        };

 _handler.postDelayed(getData, DATA_INTERVAL);

在 ondestroy() 中,我使用,

_handler.removeCallbacks(getData);

但是 removecallbacks 不起作用。它在退出活动后调用。

4

3 回答 3

10

removeCallbacks(Runnable r)

删除消息队列中所有待处理的 Runnable r 帖子。

因此removeCallbacks(..)仅停止当前未运行的未决消息(Runnables),因此如果您想停止当前正在运行的 Runable,则在用户退出应用程序时使用布尔变量来停止线程。

请参阅此帖子以了解removeCallbacks 不会停止可运行

于 2012-08-16T06:49:41.687 回答
0

您没有显示代码中最重要的部分,即receiveData方法。正如您所说,您正在定期运行任务,您必须postDelayed从该方法内部再次调用以重新安排任务。可能涉及后台线程,因为您无法在主线程上进行联网。

退出 Activity 时,您很可能会遇到竞态条件。onDestroy首先运行,然后再次发布任务。

于 2016-03-15T16:27:31.917 回答
0

你应该使用

handler.removeCallbacksAndMessages(null);

然后将删除所有处理程序回调。

于 2019-07-08T06:53:10.807 回答