【问题标题】:Handler not removing callbacks from removeCallbacksAndMessages() method处理程序不从 removeCallbacksAndMessages() 方法中删除回调
【发布时间】:2019-09-01 23:24:29
【问题描述】:

当用户打开一个片段时,我需要在 30 秒后调用服务。所以,我执行以下代码。

handler.postDelayed(runnable, 30000); 

runnable = new Runnable() {
    public void run() {
       fetchData(true);
    }
};

但是当用户离开片段时我需要停止此处理程序,因此我在所有可能的暂停块中执行以下代码,但问题是如果我转到其他片段或将应用程序放入其中,它会继续访问服务历史。

@Override
public void onStop() {
    super.onStop();
    if(handler!=null) {
        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
}


@Override
public void onPause() {
    super.onPause();
    if(handler !=null){
        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
    }
}


@Override
public void onDetach() {
    super.onDetach();
    if(handler !=null){
        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
    }
}

我需要知道如何取消处理程序。

【问题讨论】:

  • 你是如何在activity中添加fragment的?您使用了以下哪种方法:addToBackStack(name) or replace(containerViewId, fragment, tag) or add(containerViewId, fragment, tag);
  • @SultanMahmud 我用过replace
  • 在 onResume 方法中添加片段可见时的处理程序代码 if ( this.isVisible()) { // 添加处理程序代码 }
  • 你能展示你的完整片段代码吗?

标签: android android-layout android-fragments android-handler


【解决方案1】:

我需要知道如何取消处理程序

处理程序没有像开始、停止或取消这样的东西。它的工作是将 Runnables 和消息发布到线程队列。

你已经写了handler.removeCallbacks(runnable); 来移除你之前开始的回调。我想这对你来说已经足够了。

【讨论】:

  • 但它会继续执行处理程序代码,即使片段处于暂停或停止状态。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多