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


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

9 89

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 просыпаться из спящего режима. Иначе говоря, если вы хотите запланировать что-то на самом деле, даже если экран выключен / процессор спит, вам также нужно проверить 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

из ссылки:

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

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мс поэтому я сделал это так

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

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