什么是等效于 Android/Java 中的 JavaScript setInterval/setTimeout?

IT技术 java javascript android settimeout
2021-03-07 16:51:50

谁能告诉我 Android 是否存在 setInterval/setTimeout 的等效项?有没有人有任何关于如何做到这一点的例子?

6个回答

与 Android 一样,有很多方法可以做到这一点,但假设您只是想稍后在同一线程上运行一段代码,我使用这个:

new android.os.Handler(Looper.getMainLooper()).postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);

..这几乎相当于

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);
@QuentinRoy:Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);如果你想取消它:timeout.removeCallbacks(r);
2021-04-20 16:51:50
如果需要,我该如何取消?
2021-05-01 16:51:50
@安迪像这样: MyActivityName.this.myFunctionOnActivity()
2021-05-04 16:51:50
如何在 run() 方法中获取活动范围?
2021-05-08 16:51:50
这是一个非常好的抽屉选择和 fragmentTransaction 的解决方案
2021-05-17 16:51:50

设置间隔()

每 n 毫秒重复一次的函数

Javascript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);

近似java等价物

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "A Kiss every 5 seconds");
    }
},0,5000);

设置超时()

仅在 n 毫秒后起作用的函数

Javascript

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);

近似java等价物

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);
对于该scheduleAtFixedRate方法,一旦该活动完成,您如何取消该活动中的计时器?
2021-04-30 16:51:50
@user824294 您可以将 Timer 实例保存在变量中,并在要停止计划任务时调用“cancel()” - Timer t = new Timer(); t.scheduleAtFixedRate(...); - 然后调用 t.cancel(); 只要你愿意。
2021-05-18 16:51:50

如果您不担心唤醒您的手机或让您的应用从死里复活,请尝试:

// Param is optional, to run task on UI thread.     
Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // Do the task...
        handler.postDelayed(this, milliseconds) // Optional, to repeat the task.
    }
};
handler.postDelayed(runnable, milliseconds);

// Stop a repeating task like this.
handler.removeCallbacks(runnable);
在我的手机(Huawei P Smart)上,Handler 不会将设备从睡眠模式唤醒(正如 apanloco 在另一个答案中所说
2021-05-19 16:51:50

根据您实际想要实现的目标,您应该查看 Android 处理程序:

http://developer.android.com/reference/android/os/Handler.html

如果您以前使用 javascript setTimeout() 等来安排一个任务在未来运行,这就是 Android 的做法(postDelayed / sendMessageDelayed)。

请注意,处理程序或计时器都不会使 Android 手机从睡眠模式中唤醒。换句话说,如果你想在屏幕关闭/cpu 休眠的情况下安排一些实际发生的事情,你也需要检查 AlarmManager。

第一个答案绝对是正确的答案,也是我基于此 lambda 版本的基础,它的语法要短得多。由于 Runnable 只有 1 个覆盖方法“run()”,我们可以使用 lambda:

this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);