1

下面我有一个可运行的“更新程序”......和一个使用 Handler.PostDelayed 函数在延迟后运行可运行的 OnClick 函数......

经过一点编辑,这里的无用部分的切割是功能:(passtog = Toggle Button)

 final Runnable updater = new Runnable() {

            @Override
            public void run() {


                if (passTog.isChecked()) {              
                    now = System.currentTimeMillis();
                    time = now - init;

                    if (time > 5000) {
                        Toast.makeText(getApplicationContext(), "WAKE UP !",
                                Toast.LENGTH_SHORT).show();

                    }

                    handler.postDelayed(this, 25);
                }
            }
        };

        passTog.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                init = System.currentTimeMillis();
                flag = true;

                handler.postDelayed(updater,
                        (new Random().nextInt(4000) + 3000));

            }
        });
    }

解释 基本上,用户切换切换按钮。现在它开始了:runnable 可以完全运行(一切都在 if 块中)。如果用户没有再次按下按钮并将其关闭应用程序会发送一个 Toast “Wake Up!” ..它每 25 毫秒运行并检查一次以更新时间...

非常简单......但是我遇到了问题。

在程序真正进入可运行之前,我绝对需要有 3 秒的最小时间延迟 + 一些随机值......所以它在 3 秒 - 7 秒之间变化。它应该在 3-7 之间变化,但事实并非如此。

当我运行它时: 我注意到第一次的问题,它工作得很好......我得到至少 3 秒的延迟 + 一个随机值 = 完美

第二次,即在开关打开 ->off-> on 之后:现在它的行为就像它看不到 +3000 ...而只有 ~randInt(4000) 函数...所以它可能会给出 0秒或它可能会延迟 4 秒...

根据我的所有经验,我从来没有真正遇到过这个..我已经重写了整个代码,我的其他应用程序以完全相同的语法使用这个函数并且似乎做得非常好..为什么这会产生问题?吐司的时间可能会引起问题吗..

如何解决这个问题?(我对其他方法持开放态度,最好是快速实施。我想要至少 3 秒的延迟,但由于某种原因我没有得到......我需要 UI 做出响应,所以没有线程休眠。)

4

1 回答 1

1

当开关关闭时,您可能应该调用Handler.removeCallbacksAndMessages(null) 。

于 2013-09-19T18:56:35.003 回答