为了账号安全,请及时绑定邮箱和手机立即绑定

调用 removeCallbacksAndMessages(null) 后处理程序不会结束

调用 removeCallbacksAndMessages(null) 后处理程序不会结束

慕神8447489 2022-07-20 10:38:27
我有两个处理程序。处理程序中的处理程序。它们都在一个for循环中。概述是这样的,for{    handler.postDelayed(runnableA{        for{            handler2.postDelayed(runnableB{                function();            }, 3000);        }    }, 1000);}我想在用户单击时随时结束处理程序的工作back button。因此,我创建了两个 Runnable 类,以便我可以使用类似runnableA.removellbacksAndMessages(null).Handler messageHandler;Handler countDownHandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    Toast.makeText(this, "Start Play in 5 seconds", Toast.LENGTH_SHORT).show();    countDownHandler = new Handler();    for (int i = 7; i >= 0; --i) {        final int idx = i;        Runnable countRunnable = new CountRunnable(idx, countDownView);        countDownHandler.postDelayed(countRunnable, 1000 * (7 - i));    }}这是可运行的类。public class CountRunnable implements Runnable {    int idx;    TextView countDownView;    public CountRunnable(int idx, TextView countDownView) {        this.idx = idx;        this.countDownView = countDownView;    }    @Override    public void run() {        int messageSize = messageItems.size();        for (int j = 0; j < messageSize; j++) {            final int jdx = j;            messageHandler = new Handler();            Runnable messageRunnable = new MessageRunnable(jdx);            messageHandler.postDelayed(messageRunnable, 3000 * jdx);        }    }}class MessageRunnable implements Runnable {    int jdx;    public MessageRunnable(int jdx) {        this.jdx = jdx;    }    @Override    public void run() {        addMessageView(messageItems.get(jdx));    }}但是,我不断收到错误,因为活动已经结束但处理程序找不到活动。因此,Abnormal EndToast 消息显示的大小与内部 for 循环的大小一样多。如果我不使用 Toast 消息,我可以忽略这一点,但我担心内存泄漏或格式错误的程序或类似的东西。我该如何解决这个问题?
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

主要问题是您正在创建s 和nnumber的数量。尽管创建了多个处理程序,但您仅删除了最新创建的回调。CountRunnablemMessageRunnablesHanlder

这是你应该做的:

保留所有Handlers andRunnables和调用messageHandler.removeCallbacksAndMessages(null);and的引用countDownHandler.removeCallbacksAndMessages(null);


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信