Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 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);

Ответ 3

В зависимости от того, чего вы действительно хотите достичь, вы должны взглянуть на Android Handlers:

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Из ссылки:

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

Ответ 6

Здесь эквивалент 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();

Ответ 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

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

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