Android / Java'da JavaScript setInterval / setTimeout ile eşdeğeri nedir?


129

Biri bana Android için setInterval / setTimeout için bir eşdeğerin olup olmadığını söyleyebilir mi? Nasıl yapılacağına dair herhangi bir örneği olan var mı?

Yanıtlar:


245

Her zaman olduğu gibi, Android'de bunu yapmanın pek çok yolu vardır, ancak aynı iş parçacığı üzerinde biraz daha sonra bir kod parçası çalıştırmak istediğinizi varsayarsak, şunu kullanıyorum:

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag", "This'll run 300 milliseconds later");
        }
    }, 
300);

.. bu hemen hemen eşdeğerdir

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

Bu, çekmece seçimi ve parça için çok iyi bir çözüm
Gonçalo

6
Gerekirse nasıl iptal edebilirim?
Quentin Roy

Run () yönteminde etkinlik kapsamını nasıl elde edersiniz?
Andy

@Andy şunun gibi:MyActivityName.this.myFunctionOnActivity()
Ben Clayton

1
@QuentinRoy: Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);ve iptal etmek isterseniz:timeout.removeCallbacks(r);
Bastian Springer

101

setInterval ()

her n milisaniyede kendini tekrar eden işlev

JavaScript

 setInterval(function(){ Console.log("A Kiss every 5 seconds"); }, 5000);

Yaklaşık java Eşdeğeri

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

setTimeout ()

yalnızca n milisaniyeden sonra çalışan işlev

JavaScript

setTimeout(function(){ Console.log("A Kiss after 5 seconds"); },5000);

Yaklaşık java Eşdeğeri

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);

5
İçin scheduleAtFixedRatebu etkinlik bittikten sonra yöntemle, nasıl etkinliği içinde zamanlayıcı iptal edebilirim?
auroranil

2
@ user824294 Timer örneğinizi bir değişkene kaydedebilir ve zamanlanmış görevleri durdurmak istediğinizde "cancel ()" çağırabilirsiniz - Timer t = new Timer (); t.scheduleAtFixedRate (...); - Ve sonra t.cancel () 'i çağırın; ne zaman istersen.
Aebsubis

14

Telefonunuzu uyandırmaktan veya uygulamanızı ölümden geri getirmek konusunda endişelenmiyorsanız şunları deneyin:

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

Telefonumda (Huawei P Smart) İşleyici, cihazı uyku modundan uyandırmıyor ( apanloco'nun başka bir cevapta belirttiği gibi )
Franco

13

Gerçekte ne elde etmek istediğinize bağlı olarak, Android İşleyicilere bir göz atmalısınız:

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

Daha önce javascript setTimeout () vb. Kullandıysanız, ileride çalışacak bir görevi zamanlamak için, Android bunu yapmanın yoludur (postDelayed / sendMessageDelayed).

Ne İşleyicilerin ne de Zamanlayıcıların bir Android telefonu uyku modundan uyandırmadığını unutmayın. Diğer bir deyişle, ekran kapalıyken / cpu uyurken bir şeyi gerçekten olacak şekilde programlamak istiyorsanız, AlarmManager'ı da kontrol etmeniz gerekir.


5

JavaScript hakkında pek bir şey bilmiyorum ama bence aradığınız şey Zamanlayıcılar olabilir.

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

Bağlantıdan:

Tek atış, mutlak bir zamanda veya göreceli bir gecikmeden sonra çalışacak şekilde planlanmıştır. Yinelenen görevler, sabit bir süre veya sabit bir oranla planlanır.


Not: Sizi ana / UI iş parçacığında değil, arka plan iş parçacığında çağırır.
Pang

Bu bir cevap değil, ancak OPs çözümü içerebilecek veya içermeyecek harici bilgilere bir atıf. Lütfen OP'nin kullanabileceği ilgili kodu yapıştırın!
Lev

5

İlk cevap kesinlikle doğru cevap ve bu lambda versiyonunu temel aldığım şey bu, sözdiziminde çok daha kısa. Runnable'ın yalnızca 1 geçersiz kılma yöntemi "run ()" olduğundan, bir lambda kullanabiliriz:

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

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

4

İşte bir setTimeout eşdeğeri, çoğunlukla bir gecikmeden sonra Kullanıcı Arayüzünü güncellemeye çalışırken yararlıdır.

Bildiğiniz gibi, kullanıcı arayüzünü güncellemek yalnızca UI iş parçacığından yapılabilir. AsyncTask, bu iş parçacığından onPostExecute yöntemini çağırarak bunu sizin için yapar.

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

3
1. Benzer şekilde onProgressUpdate()simülasyon için de kullanılabilir setInterval(). 2. AsyncTask bir iş parçacığı havuzunda (veya yalnızca tek bir iş parçacığında) çalışır, bu nedenle a. başka birinin AsyncTaskbitmesini beklemek zorunda kalabilir ; b . havuzdan bir iş parçacığı alacaktır.
Pang

Bu bağlamda zaman uyumsuz görevi kullanan pek çok sorun var (sadece bir iş parçacığı ve bir iş parçacığının sebepsiz yere kilitlenmesi) - diğer çözümler çok daha iyi.
Elemental

4

Android için bir mp3 çalar oluşturuyordum, her 500 ms'de bir güncel saati güncellemek istedim bu yüzden böyle yaptım

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

aynı yöntemi yinelemeli olarak çağıran


0

Kotlin:

CountDownTimer'ı da kullanabilirsiniz:

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

Ve kodunuzda:

Timer.call(5000) { /*Whatever you want to execute after 5000 ms*/ }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.