Android 如何在随机时间延迟后执行操作?-安卓

Android 如何在随机时间延迟后执行操作?-安卓,android,random,time,Android,Random,Time,所以我在“我没告诉你”上制作了一个应用程序…-) 进入问题: final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff); passTog.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { init = System.currentT

所以我在“我没告诉你”上制作了一个应用程序…-)

进入问题:

   final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff);

passTog.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    init = System.currentTimeMillis();
                    handler.post(updater);
                }
            });
上面是一个普通的切换按钮,我之前定义了一个处理程序,使用它我正在运行一个可运行的命名更新程序…(对于以下内容:“display”是一个textview)

这是runnable。。。 变量时间,现在,初始化。。。是时间变量

我试图做的是(现在)用自按下切换按钮以来经过的毫秒数更新textview(请参阅if语句)

对上述代码的解释

因此,活动开始,单击切换按钮,init变量获取当前时间的值。。。程序进入可运行状态。现在,在仔细检查按钮是否处于“打开”状态后。。。系统将当前时间设置为“现在”。。。我们用时间变量作为两者的减法。这会在文本视图“显示”中每30毫秒更新一次。 在该应用程序中,您可以看到随着时间的推移textview步调。效果很好

就是这样,我想要的是

活动开始时,您按下按钮。。 在随机时间延迟之后*比如说2-10秒之间。。。。然后,文本视图应该开始更新

我们按下一个按钮,似乎什么都没有发生,然后在那个随机延迟之后。。。textview突然出现,并从1ms开始大量输出当前时间,也就是说,上述runnable应该在该随机时间延迟之后运行

在这件事上,这是完全合乎逻辑的,并不是真正的技术性的——我需要在runnable做这件事之前引入一个非固定的时间延迟

我想我们可以在runnable中自己做到这一点。。。我们已经有了“时间”变量。。。。为什么不在“如果”语句中使用它。。。。然后重置时间变量,使其看起来从头开始

笨重的东西,我就是弄不好


你知道我们该怎么做吗?

干脆推迟runnable的第一篇文章怎么样

public void onClick(View v) {
    init = System.currentTimeMillis();
    handler.postDelayed(updater, 2000+(new Random().nextInt(8000));
}
在最小2000ms和最大999ms之后,TextView开始更新。单击按钮后,初始时间保持不变。如果希望初始时间也是延迟的,请尝试以下操作:

public void onClick(View v) {
    init = -1;
    handler.postDelayed(updater, 2000+(new Random().nextInt(8000));
}



final Runnable updater = new Runnable() {
            @Override
            public void run() {
                if (passTog.isChecked()) {
                    if(init == -1) init = System.currentTimeInMillis();
                    now = System.currentTimeMillis();
                    time = now - init;
                    display.setText(time + " ms");
                    handler.postDelayed(this, 30);
                }
            }
        };
这就是你想要实现的目标,还是我理解错了?

试试以下方法:

 Thread t= new Thread(){
        @Override
    public void run(){
            try {
                sleep(1000);
            } catch (InterruptedException e) {

            }
            finally {
                performActionHere();
            }
        }
    };

    t.start();

哦,我真的不想和线程和睡眠有任何关系。我需要保持UI的响应性。我对这种东西有过非常糟糕的经历!如果你睡在一个线程上,用户界面会有响应。你只是不能阻止UI线程,这将导致InResponsibility.Hmmmm。。。这可能有效,但不是随机的…:/另一个解决方案对我有效!需要一点编辑,但效果不错!第二个,正是我想要的。。。使用init作为检查是一个好主意:-)谢谢!
 Thread t= new Thread(){
        @Override
    public void run(){
            try {
                sleep(1000);
            } catch (InterruptedException e) {

            }
            finally {
                performActionHere();
            }
        }
    };

    t.start();
new CountDownTimer(2000, 1000) {
                  //currently time delay is 2000 milliseconds
            @Override
            public void onFinish() {
                // TODO Auto-generated method stub
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        // do your task here

                    }
                });
            }

            @Override
            public void onTick(long millisUntilFinished) {
            }
        }.start();