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

时间:2011-01-27 14:58:03

标签: java javascript android settimeout

任何人都可以告诉我,如果Android的setInterval / setTimeout存在等价物吗?有没有人有关于如何做的例子?

11 个答案:

答案 0 :(得分:210)

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

new android.os.Handler().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);

答案 1 :(得分:76)

<强>的setInterval()

每隔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);

<强>的setTimeout()

仅在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);

答案 2 :(得分:12)

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

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

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

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

答案 3 :(得分:11)

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

// 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.
hander.removeCallbacks(runnable);

答案 4 :(得分:5)

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

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

从链接:

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

答案 5 :(得分:4)

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();
    }
}

答案 6 :(得分:3)

这是一个setTimeout等效项,在尝试更新用户界面时非常有用 经过一段时间后。

您可能知道,只能通过UI线程完成更新用户界面。 AsyncTask通过从该线程调用其onPostExecute方法为您做到这一点。

new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Update the User Interface
        }

    }.execute();

答案 7 :(得分:3)

第一个答案肯定是正确的答案,而且是我基于这个lambda版本的,它的语法要短得多。由于Runnable只有1个覆盖方法&#34; run()&#34;,我们可以使用lambda:

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

答案 8 :(得分:2)

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

的setInterval

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);
}

以递归方式调用相同的方法

答案 9 :(得分:0)

科特琳:

您还可以使用CountDownTimer:

class Timer {
    companion object {
        @JvmStatic
        fun call(ms: Long, f: () -> Unit) {
            object : CountDownTimer(ms,ms){
                override fun onFinish() { f() }
                override fun onTick(millisUntilFinished: Long) {}
            }.start()
        }
    }
}

在您的代码中:

Timer.call(5000) { /*Whatever you want to execute after 5000 ms*/ }

答案 10 :(得分:0)

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

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "Hai Codemaker");
    }
},0,1000);

此代码将每隔一秒记录一次 Hai Codemaker 文本。