Что эквивалентно JavaScript setInterval/setTimeout в Android / Java?

может ли кто-нибудь сказать мне, Существует ли эквивалент setInterval/setTimeout для Android? У кого-нибудь есть пример, как это сделать?

9 ответов


Как всегда, с 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);

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

в зависимости от того, что вы на самом деле хотите достичь, вы должны взглянуть на обработчики Android:

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

Если вы ранее использовали javascript setTimeout () и т. д., чтобы запланировать задачу для запуска в будущем, это способ Android (postDelayed / sendMessageDelayed).

обратите внимание, что ни обработчики, ни таймеры не заставляют телефон Android просыпаться из спящего режима. Иначе говоря, если вы хотите запланировать что-то на самом деле, даже если экран выключен / cpu спит, вам также нужно проверить AlarmManager.


Если вы не беспокоитесь о пробуждении телефона или чего приложения из мертвых, попробовать:

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

Я мало знаю о JavaScript, но я думаю, что таймеры могут быть тем, что вы ищете.

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

из ссылки:

One-shot планируется запустить в абсолютное время или после относительной задержки. Повторяющиеся задачи запланированы с фиксированным периодом или фиксированной ставкой.


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

вот эквивалент setTimeout, в основном полезный при попытке обновить пользовательский интерфейс после задержки.

Как вы знаете, обновление пользовательского интерфейса может быть выполнено только из потока пользовательского интерфейса. 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();

первый ответ, безусловно, правильный ответ и то, что я основал эту лямбда-версию, которая намного короче в синтаксисе. Поскольку Runnable имеет только 1 метод переопределения " run ()", мы можем использовать лямбда:

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

Я создавал mp3-плеер для android, я хотел обновлять текущее время каждый 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);
}

которая вызывает тот же метод рекурсивно