Handler.postDelayed函数不会产生时间延迟? - Android

时间:2013-09-19 18:39:50

标签: java android random time

下面我有一个Runnable“updater”...和一个OnClick函数,它使用Handler.PostDelayed函数在延迟后运行runnable ......

经过一些编辑后,这里切割无用的部件是功能: (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可以完全运行(Everything在if块中)。 如果用户没有再次按下该按钮,并将其关闭该应用程序发送Toast“Wake Up!” ..它运行并检查每25毫秒更新时间......

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

在程序实际到达runnable之前,我绝对需要最小时间延迟3秒+一些随机值...所以它在3秒到7秒之间变化。它应该在3-7之间变化,但它不会。

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

第二次,即在开关接通后 - > gt; off-> on:现在它的行为就像它没有看到+3000 ......而只是~randInt(4000)功能...所以它可能会给0秒或它可能会给4秒延迟......

根据我的经验,我从未真正遇到过这个......我已经重写了整个代码,我的其他应用程序在完全相同的sytax中使用此功能,并且看起来非常棒。为什么这会创建一个问题? Toast的时间可能会导致问题..

如何解决这个问题? (我对其他方法持开放态度,最好快速实现。我希望至少有3秒的延迟,但由于某种原因我没有得到...我需要UI才能响应,所以没有线程在睡觉。)

1 个答案:

答案 0 :(得分:1)

当开关关闭时,你可能应该拨打Handler.removeCallbacksAndMessages(null)