Saya mengembangkan aplikasi untuk menampilkan beberapa teks pada interval yang ditentukan di layar Android emulator. Saya menggunakan Handler
kelas. Ini cuplikan dari kode saya:
handler = new Handler();
Runnable r = new Runnable() {
public void run() {
tv.append("Hello World");
}
};
handler.postDelayed(r, 1000);
Ketika saya menjalankan aplikasi ini teks hanya ditampilkan sekali. Mengapa?
android
multithreading
Rajapanda
sumber
sumber
Jawaban:
Perbaikan sederhana untuk contoh Anda adalah:
Atau kita dapat menggunakan utas normal misalnya (dengan Runner asli):
Anda dapat mempertimbangkan objek runnable Anda hanya sebagai perintah yang dapat dikirim ke antrian pesan untuk dieksekusi, dan handler hanya sebagai objek pembantu yang digunakan untuk mengirim perintah itu.
Detail lebih lanjut ada di sini http://developer.android.com/reference/android/os/Handler.html
sumber
sumber
Saya pikir dapat meningkatkan solusi pertama Alex2k8 untuk memperbarui yang benar setiap detik
1. kode asli:
2. Analisis
tv.append("Hello Word")
biaya T milidetik, setelah tampilan 500 kali waktu tunda adalah 500 * T milidetik3. Solusi
Untuk menghindarinya Cukup ubah urutan postDelayed (), untuk menghindari penundaan:
sumber
Untuk pengulangan tugas yang bisa Anda gunakan
menyebutnya seperti
Dimana
tugas menjadi metode yang akan dieksekusi
setelah waktu untuk eksekusi awal
( interval waktu untuk mengulangi eksekusi)
Kedua
Dan Anda juga dapat menggunakan CountDownTimer jika Anda ingin menjalankan tugas beberapa kali.
Dan Anda juga bisa melakukannya dengan runnable. buat metode runnable seperti
Dan menyebutnya dengan kedua cara ini
ATAU
sumber
Saya percaya untuk kasus khas ini, yaitu menjalankan sesuatu dengan interval tetap,
Timer
lebih tepat. Ini adalah contoh sederhana:Menggunakan
Timer
memiliki beberapa keuntungan:schedule
argumen fungsimyTimer.cancel()
myTimer.cancel()
sebelum menjadwalkan utas baru (jika myTimer bukan nol)sumber
sumber
r
yang belum ditentukan.Jika saya mengerti dengan benar dokumentasi metode Handler.post ():
Jadi contoh yang diberikan oleh @ alex2k8, meskipun berfungsi dengan benar, tidak sama. Jika
Handler.post()
digunakan, tidak ada utas baru yang dibuat . Anda cukup mempostingRunnable
ke utas denganHandler
dieksekusi oleh EDT . Setelah itu, EDT hanya mengeksekusiRunnable.run()
, tidak ada yang lain.Ingat:
Runnable != Thread
.sumber
Kotlin
Jawa
sumber
Contoh yang menarik adalah Anda dapat terus melihat konter / stop-watch berjalan di utas terpisah. Juga menunjukkan Lokasi GPS. Sementara aktivitas utama User Interface Thread sudah ada di sana.
Kutipan:
Untuk melihat kode lihat di sini:
Contoh utas menampilkan Lokasi GPS dan Waktu Saat Ini dapat dijalankan bersamaan dengan Utas Antarmuka Pengguna aktivitas utama
sumber
sekarang di Kotlin Anda dapat menjalankan utas dengan cara ini:
sumber
Kotlin dengan Coroutines
Di Kotlin, menggunakan coroutine Anda dapat melakukan hal berikut:
Cobalah di sini !
sumber