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

kar*_*e23 113 javascript java android settimeout

任何人都能告诉我是否存在Android的setInterval/setTimeout的等价物?有人有任何关于如何做的例子吗?

Ben*_*ton 221

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

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);
Run Code Online (Sandbox Code Playgroud)

..这几乎相当于

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);
Run Code Online (Sandbox Code Playgroud)

  • 如果需要,我该如何取消? (5认同)
  • @QuentinRoy:`处理程序超时 = new Handler(); 最终 Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);` 如果你想取消它: `timeout.removeCallbacks(r);` (2认同)

Mid*_*hun 85

的setInterval()

每n毫秒重复一次的函数

使用Javascript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
Run Code Online (Sandbox Code Playgroud)

近似java等价

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

的setTimeout()

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

使用Javascript

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
Run Code Online (Sandbox Code Playgroud)

近似java等价

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);
Run Code Online (Sandbox Code Playgroud)

  • 对于`scheduleAtFixedRate`方法,如果活动结束后如何取消活动中的计时器? (5认同)
  • @ user824294你可以将你的Timer实例保存在一个变量中,当你想要停止计划任务时调用"cancel()" - Timer t = new Timer(); t.scheduleAtFixedRate(...); - 然后调用t.cancel(); 随时随地. (2认同)

apa*_*oco 12

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

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

如果您以前使用过javascript setTimeout()等来安排将来运行的任务,那么这就是Android的做法(postDelayed/sendMessageDelayed).

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


Sha*_*ley 12

如果您不担心将手机唤醒或将应用程序从死亡状态恢复,请尝试:

// 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);
Run Code Online (Sandbox Code Playgroud)


neo*_*ley 6

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

this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
Run Code Online (Sandbox Code Playgroud)


nic*_*ild 5

我对JavaScript知之甚少,但我认为Timers可能就是你想要的.

http://developer.android.com/reference/java/util/Timer.html

从链接:

一次射击计划在绝对时间或相对延迟之后运行.重复任务按固定期间或固定费率安排.


Jee*_*eva 5

import java.util.Timer;
import java.util.TimerTask;

class Clock {
    private Timer mTimer = new Timer();

    private int mSecondsPassed = 0;
    private TimerTask mTask = new TimerTask() {
        @Override
        public void run() {
            mSecondsPassed++;
            System.out.println("Seconds passed: " + mSecondsPassed);
        }
    };

    private void start() {
        mTimer.scheduleAtFixedRate(mTask, 1000, 1000);
    }

    public static void main(String[] args) {
        Clock c = new Clock();
        c.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用mTimer.cancel()清除间隔。 (2认同)

Jee*_*eva 5

我正在为 android 创建一个 mp3 播放器,我想每500 毫秒更新一次当前时间,所以我这样做了

设置间隔

private void update() {
    new android.os.Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            long cur = player.getCurrentPosition();
            long dur = player.getDuration();
            currentTime = millisecondsToTime(cur);
            currentTimeView.setText(currentTime);
            if (cur < dur) {
                updatePlayer();
            }

            // update seekbar
            seekBar.setProgress( (int) Math.round((float)cur / (float)dur * 100f));
        }
    }, 500);
}
Run Code Online (Sandbox Code Playgroud)

递归调用相同的方法