【问题标题】:What is the equivalent to a JavaScript setInterval/setTimeout in Android/Java?什么相当于 Android/Java 中的 JavaScript setInterval/setTimeout?
【发布时间】:2011-06-16 14:51:06
【问题描述】:

谁能告诉我是否存在适用于 Android 的 setInterval/setTimeout 等价物?有没有人可以举个例子说明一下?

【问题讨论】:

    标签: java javascript android settimeout


    【解决方案1】:

    与往常一样,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);
    

    【讨论】:

    • 这是一个非常好的抽屉选择和fragmentTransaction的解决方案
    • 如果需要如何取消?
    • run()方法中如何获取活动范围?
    • @Andy 像这样:MyActivityName.this.myFunctionOnActivity()
    • @QuentinRoy:Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);,如果你想取消它:timeout.removeCallbacks(r);
    【解决方案2】:

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

    【讨论】:

    • 对于scheduleAtFixedRate 方法,一旦活动完成,如何取消活动内的计时器?
    • @user824294 您可以将 Timer 实例保存在一个变量中,并在您想停止计划任务时调用“cancel()” - Timer t = new Timer(); t.scheduleAtFixedRate(...); - 然后调用 t.cancel();随时随地。
    【解决方案3】:

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

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

    【讨论】:

    【解决方案4】:

    根据您实际想要实现的目标,您应该看看 Android Handlers:

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

    如果您之前使用 javascript setTimeout() 等来安排将来运行的任务,这是 Android 的执行方式(postDelayed / sendMessageDelayed)。

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        我对 JavaScript 了解不多,但我认为 Timers 可能是您正在寻找的东西。

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

        来自链接:

        一次性计划在绝对时间或相对延迟后运行。周期性任务按固定周期或固定速率安排。

        【讨论】:

        • 注意:它在后台线程上调用你,而不是在主/UI线程上。
        • 这不是答案,而是对可能包含也可能不包含 OP 解决方案的外部信息的引用。请粘贴OP可以使用的相关代码!
        【解决方案7】:
        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();
            }
        }
        

        【讨论】:

          【解决方案8】:

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

          设置间隔

          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】:

            这是一个等效的 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();
            

            【讨论】:

            • 1. 同样,onProgressUpdate()也可以用来模拟setInterval()。 2. AsyncTask 在线程池(或仅单个线程)上运行,因此 a. 它可能必须等到另一个 AsyncTask 完成; b。它将占用池中的一个线程。
            • 在这种情况下使用异步任务会有很多问题(只有一个线程并且无缘无故锁定一个线程)-其他解决方案要好得多。
            【解决方案10】:

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

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

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

            【讨论】:

              【解决方案11】:

              科特林:

              您也可以使用 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*/ }
              

              【讨论】:

                猜你喜欢
                • 2016-02-14
                • 1970-01-01
                • 1970-01-01
                • 2021-08-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-11-18
                相关资源
                最近更新 更多