Apa yang setara dengan JavaScript setInterval / setTimeout di Android / Java?

129

Adakah yang bisa memberi tahu saya jika ada persamaan untuk setInterval / setTimeout untuk Android? Adakah yang punya contoh tentang cara melakukannya?

karse23
sumber

Jawaban:

245

Seperti biasa dengan Android ada banyak cara untuk melakukan ini, tetapi dengan asumsi Anda hanya ingin menjalankan sepotong kode sedikit kemudian di utas yang sama, saya menggunakan ini:

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

.. ini hampir setara dengan

setTimeout( 
    function() {
        console.log("This will run 300 milliseconds later");
    },
300);
Ben Clayton
sumber
Ini adalah solusi yang sangat baik untuk pemilihan laci dan
fragmenTransaksi
6
Bagaimana saya bisa membatalkannya jika perlu?
Quentin Roy
Bagaimana Anda mendapatkan ruang lingkup aktivitas dalam metode run ()?
Andy
@Andy menyukai ini:MyActivityName.this.myFunctionOnActivity()
Ben Clayton
1
@ QuentinRoy: Handler timeout = new Handler(); final Runnable r = new Runnable{...}; timeout.postDelayed(r, 300);dan jika Anda ingin membatalkannya:timeout.removeCallbacks(r);
Bastian Springer
101

setInterval ()

fungsi yang berulang dalam setiap milidetik

Javascript

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

Perkiraan java Equivalent

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

setTimeout ()

fungsi yang hanya berfungsi setelah n milidetik

Javascript

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

Perkiraan java Equivalent

new android.os.Handler().postDelayed(
    new Runnable() {
        public void run() {
            Log.i("tag","A Kiss after 5 seconds");
        }
}, 5000);
Midhun
sumber
5
Untuk scheduleAtFixedRatemetode ini, bagaimana Anda membatalkan timer dalam aktivitas setelah aktivitas tersebut selesai?
auroranil
2
@ user824294 Anda dapat menyimpan instance Timer Anda dalam sebuah variabel dan memanggil "cancel ()" ketika Anda ingin menghentikan tugas yang dijadwalkan - Timer t = Timer baru (); t.scheduleAtFixedRate (...); - Dan kemudian hubungi t.cancel (); kapanpun kamu mau.
Aebsubis
14

Jika Anda tidak khawatir membangunkan ponsel atau mengembalikan aplikasi Anda dari kematian, coba:

// 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);
SharkAlley
sumber
Di ponsel saya (Huawei P Smart) Handler tidak membangunkan perangkat dari mode tidur ( seperti yang dikatakan oleh apanloco dalam jawaban lain )
Franco
13

Bergantung pada apa yang sebenarnya ingin Anda capai, Anda harus melihat pada Android Handlers:

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

Jika sebelumnya Anda menggunakan javascript setTimeout () dll untuk menjadwalkan tugas untuk dijalankan di masa mendatang, ini adalah cara Android untuk melakukannya (postDelayed / sendMessageDelayed).

Perhatikan bahwa Handler atau Timer tidak membuat ponsel Android bangun dari mode tidur. Dengan kata lain, jika Anda ingin menjadwalkan sesuatu untuk benar-benar terjadi meskipun layar mati / cpu sedang tidur, Anda perlu memeriksa AlarmManager juga.

apanloco
sumber
5

Saya tidak tahu banyak tentang JavaScript, tapi saya pikir Timers mungkin yang Anda cari.

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

Dari tautan:

Satu tembakan dijadwalkan untuk berjalan pada waktu absolut atau setelah jeda relatif. Tugas berulang dijadwalkan dengan periode tetap atau kurs tetap.

nicholas.hauschild
sumber
Catatan: Ini memanggil Anda di utas latar, bukan utas utama / UI.
Pang
Ini bukan jawaban, tetapi referensi ke informasi eksternal yang mungkin atau mungkin bahkan tidak mengandung solusi OPs. Silakan tempel kode yang relevan yang dapat digunakan OP!
Im
5

Jawaban pertama jelas merupakan jawaban yang benar dan saya mendasari versi lambda ini, yang jauh lebih pendek dalam sintaksisnya. Karena Runnable hanya memiliki 1 metode override "run ()", kita dapat menggunakan lambda:

this.m_someBoolFlag = false;
new android.os.Handler().postDelayed(() -> this.m_someBoolFlag = true, 300);
neoRiley
sumber
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();
    }
}
Astaga
sumber
4

Berikut ini adalah setTimeout setara, sebagian besar berguna ketika mencoba memperbarui Antarmuka Pengguna setelah penundaan.

Seperti yang Anda ketahui, memperbarui antarmuka pengguna hanya dapat dilakukan dari utas UI. AsyncTask melakukan itu untuk Anda dengan memanggil metode onPostExecute dari utas itu.

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();
Stephane JAIS
sumber
3
1. Demikian pula, onProgressUpdate()dapat juga digunakan untuk mensimulasikan setInterval(). 2. AsyncTask berjalan di thread pool (atau hanya satu thread), jadi a. mungkin harus menunggu sampai yang lain AsyncTaskselesai; b . itu akan mengambil satu utas dari kolam.
Pang
Ada banyak masalah menggunakan tugas async dalam konteks ini (hanya satu utas dan penguncian utas tanpa alasan) - solusi lain jauh lebih baik.
Elemental
4

Saya sedang membuat mp3 player untuk android, saya ingin memperbarui waktu sekarang setiap 500 ms jadi saya melakukannya seperti ini

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

yang memanggil metode yang sama secara rekursif

ZeroErr0r
sumber