【问题标题】:How to remove a Runnable that is not assigned to a variable from a Handler如何从 Handler 中删除未分配给变量的 Runnable
【发布时间】:2016-06-01 15:28:47
【问题描述】:

我启动了一个 runnnable,但没有将它分配给变量。我该如何阻止它?我知道它是 removeCallbacksAndMessages() 方法的组合,但是我不知道要传递给该方法的参数是什么,因为我创建了一个匿名可运行对象:

mStartButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            h = new Handler();
            final int delay = 1000; //milliseconds

            h.postDelayed(new Runnable() {
                public void run() {
                    mUpdateRef.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            int mNumberOfPollsForCurrentDay = (int) dataSnapshot.getChildrenCount();
                            Random r = new Random();
                            int randomPollInRangeOfCurrentDayNumberOfPolls = r.nextInt((mNumberOfPollsForCurrentDay + 1) - 1) + 1;
                            int numberOfPollAnswersAtRandomNumber = (int) dataSnapshot.child(String.valueOf(randomPollInRangeOfCurrentDayNumberOfPolls)).child(POLL_ANSWERS_LABEL).getChildrenCount();
                            Random rr = new Random();
                            int randomAnswerBasedFromRandomPollAnswerChoices = rr.nextInt((numberOfPollAnswersAtRandomNumber + 1) - 1) + 1;
                            mUpdateRef.child(String.valueOf(randomPollInRangeOfCurrentDayNumberOfPolls)).child(POLL_ANSWERS_LABEL).child(String.valueOf(randomAnswerBasedFromRandomPollAnswerChoices)).child("Vote_Count").runTransaction(new Transaction.Handler() {
                                @Override
                                public Transaction.Result doTransaction(MutableData mutableData) {
                                    mutableData.setValue((Long) mutableData.getValue() + 1);
                                    return Transaction.success(mutableData);
                                }

                                @Override
                                public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) {

                                }
                            });

                        }

                        @Override
                        public void onCancelled(FirebaseError firebaseError) {

                        }
                    });
                    h.postDelayed(this, delay);
                }
            }, delay);

        }
    });

【问题讨论】:

  • 我认为你需要停止 Handler,stackoverflow.com/questions/18671067/…
  • @stjepano - 不,这个 Runnable 是一个匿名类
  • 停止runnable的一种方法是在run()的开头放置一个“活动”布尔值并切换它以终止runnable。
  • @cricket_007,我的意思是在线程的上下文中停止Runnable,Runnable本身不是线程,只是线程执行的代码。
  • @stjepano - 我知道您要做什么,但是如果您将发布的链接与此代码进行比较,则其他问题已保存对 Runnable 的引用。这个问题不是——它是一个匿名的 Runnable,你不能用它来调用 removeCallbacks。

标签: java android handler runnable


【解决方案1】:

调用h.removeCallbacksAndMessages(null) 将删除documentation 中所述的所有回调和消息:

删除所有待处理的回调和已发送消息,其 obj 为 令牌。如果 token 为 null,所有的回调和消息都会被移除。

请注意,如果 runnable 已经在执行中,这不会停止它,但如果它仍处于挂起状态,则会将其删除。

【讨论】:

  • 不确定你的意思是它正在执行中。你的意思是它会在终止前完成最后一项任务吗?您的解决方案有效,感谢您的帮助,只是想进一步了解该过程。
  • 我不是 100% 确定你所说的“停止可运行”是什么意思。您正在延迟发布可运行对象,因此如果您的意思是停止可运行对象,因为在延迟到期之前停止执行,那么 h.removeCallbacksAndMessages(null) 就是您想要的。但是,如果您的意思是停止一个可运行对象,因为延迟已经过期,并且我当前正在执行可运行对象的 run() 方法,那么调用 h.removeCallbacksAndMessages(null) 将不会在运行方法中间停止执行。
  • 不确定最后一条评论是否对您有所帮助或使您感到困惑。基本上h.removeCallbacksAndMessages(null) 将取消 Runnable 的执行,只要它仍处于挂起状态(尚未开始运行)。如果它已经开始运行,那么Runnable 仍然会运行到完成。
  • 改写问题的最佳方式是什么?我将相应地进行编辑。
  • 嗯,这是个好问题。我认为标题中对我来说唯一令人困惑的词是“停止”,将其替换为“删除”可能更有意义。可能类似于“如何从处理程序中删除未分配给变量的 Runnable”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多