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

我有两个处理程序。处理程序中的处理程序。它们都在一个for循环中。


概述是这样的,


for{

    handler.postDelayed(runnableA{

        for{

            handler2.postDelayed(runnableB{

                function();

            }, 3000);

        }

    }, 1000);

}

我想在用户单击时随时结束处理程序的工作back button。因此,我创建了两个 Runnable 类,以便我可以使用类似runnableA.removellbacksAndMessages(null).


Handler messageHandler;

Handler countDownHandler;


@Override

protected 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 消息,我可以忽略这一点,但我担心内存泄漏或格式错误的程序或类似的东西。


我该如何解决这个问题?


慕神8447489
浏览 135回答 1
1回答

一只甜甜圈

主要问题是您正在创建s 和nnumber的数量。尽管创建了多个处理程序,但您仅删除了最新创建的回调。CountRunnablemMessageRunnablesHanlder这是你应该做的:保留所有Handlers andRunnables和调用messageHandler.removeCallbacksAndMessages(null);and的引用countDownHandler.removeCallbacksAndMessages(null);。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java