在Android/Java中,JavaScript setInterval/setTimeout的等效值是什么?

在Android/Java中,JavaScript setInterval/setTimeout的等效值是什么?,java,javascript,android,settimeout,Java,Javascript,Android,Settimeout,有人能告诉我Android是否存在setInterval/setTimeout的等效值吗?有没有人能举例说明如何使用JavaScript?我对JavaScript了解不多,但我认为计时器可能是您所需要的 从链接: 计划在绝对时间或相对延迟后运行一次放炮。周期性任务的计划可以是固定的周期,也可以是固定的速率。根据您实际想要实现的目标,您应该看看Android处理程序: 如果您以前使用javascript setTimeout()等来计划将来运行的任务,这是Android的方法(postDela

有人能告诉我Android是否存在setInterval/setTimeout的等效值吗?有没有人能举例说明如何使用JavaScript?

我对JavaScript了解不多,但我认为计时器可能是您所需要的

从链接:


计划在绝对时间或相对延迟后运行一次放炮。周期性任务的计划可以是固定的周期,也可以是固定的速率。

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

如果您以前使用javascript setTimeout()等来计划将来运行的任务,这是Android的方法(postDelayed/sendMessageDelayed)


请注意,无论是处理器还是定时器都不会让Android手机从睡眠模式中醒来。换句话说,如果您想在屏幕关闭/cpu处于休眠状态的情况下安排实际发生的事情,您也需要查看AlarmManager。

这里有一个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();
newasynctask(){
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
睡眠(5000);
}捕捉(中断异常e){
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//更新用户界面
}
}.execute();

如果您不担心唤醒手机或让应用死而复生,请尝试:

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

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

new android.os.Handler(Looper.getMainLooper()).postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);
new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "Hai Codemaker");
    }
},0,1000);
。。这相当于

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);
setInterval()

每n毫秒重复一次的函数

Javascript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
近似值java等效值

new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "A Kiss every 5 seconds");
    }
},0,5000);
new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);
setTimeout()

仅在n毫秒后工作的函数

Javascript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);
setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);
近似值java等效值

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

第一个答案肯定是正确的,是我基于lambda版本的,它的语法要短得多。由于Runnable只有1个重写方法“run()”,因此我们可以使用lambda:

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

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

设定间隔
private void update(){
新的android.os.Handler().postDelayed(新的Runnable()){
@凌驾
公开募捐{
long cur=player.getCurrentPosition();
long dur=player.getDuration();
currentTime=毫秒至时间(cur);
currentTimeView.setText(当前时间);
if(cur
它递归调用相同的方法

Kotlin:

您还可以使用倒计时:

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*/ }

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

new android.os.Handler(Looper.getMainLooper()).postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);
new Timer().scheduleAtFixedRate(new TimerTask(){
    @Override
    public void run(){
       Log.i("tag", "Hai Codemaker");
    }
},0,1000);

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

注意:它在后台线程上调用您,而不是在主/UI线程上调用您。这不是答案,而是对外部信息的引用,这些信息可能包含或可能不包含OPs解决方案。请在相关代码中粘贴OP即可使用!1.类似地,
onProgressUpdate()
也可用于模拟
setInterval()
。2.
AsyncTask
在线程池(或仅在单个线程)上运行,因此。它可能需要等待另一个
AsyncTask
完成;B它将占用池中的一个线程。在这种情况下使用异步任务会有很多问题(只有一个线程,并且线程被无故锁定)-其他解决方案要好得多。这是抽屉选择和碎片交易的一个非常好的解决方案。如果需要,我如何取消它?如何在run()方法中获取活动范围?@Andy如下:
MyActivityName.This.myFunctionOnActivity()
@QuentinRoy:
Handler timeout=new Handler();最终可运行r=新可运行{…};超时。后延迟(r,300)timeout.removeCallbacks(r)
对于
scheduleAtFixedRate
方法,在活动完成后如何取消活动中的计时器?@user824294您可以将计时器实例保存在变量中,并在要停止计划任务时调用“cancel()”-timer t=new timer();t、 时间表固定日期(…);-然后调用t.cancel();在我的手机(华为P Smart)上,处理器不会将设备从睡眠模式唤醒()