Saya memiliki variabel dalam kode saya mengatakan itu adalah "status".
Saya ingin menampilkan beberapa teks dalam aplikasi tergantung pada nilai variabel ini. Ini harus dilakukan dengan penundaan waktu tertentu.
Itu seperti,
Periksa nilai variabel status
Tampilkan beberapa teks
Tunggu 10 detik
Periksa nilai variabel status
Tampilkan beberapa teks
Tunggu 15 detik
dan seterusnya. Waktu tunda dapat bervariasi dan diatur setelah teks ditampilkan.
Saya sudah mencoba Thread.sleep(time delay)
dan gagal. Adakah cara yang lebih baik untuk menyelesaikan ini?
android
android-thread
Kalpa Pathum Welivitigoda
sumber
sumber
Jawaban:
Anda harus menggunakan
Handler
'spostDelayed
fungsi untuk tujuan ini. Ini akan menjalankan kode Anda dengan penundaan yang ditentukan pada utas UI utama, sehingga Anda dapat memperbarui kontrol UI.sumber
Bagi siapa pun yang tertarik, inilah kelas yang saya buat menggunakan kode inazaruk yang menciptakan semua yang diperlukan (saya menyebutnya UIUpdater karena saya menggunakannya untuk memperbarui UI secara berkala, tetapi Anda dapat menyebutnya apa pun yang Anda suka):
Anda kemudian dapat membuat objek UIUpdater di dalam kelas Anda dan menggunakannya seperti:
Jika Anda ingin menggunakan ini sebagai pembaru aktivitas, masukkan panggilan awal di dalam metode onResume () dan stop call di dalam onPause (), sehingga pembaruan mulai dan berhenti sesuai dengan visibilitas aktivitas.
sumber
UPDATE_INTERVAL = interval;
harus sebelumthis(uiUpdater);
dalamUIUpdater(Runnable uiUpdater, int interval)
(karena nilaiUPDATE_INTERVAL
digunakan dan harus yang dilewatkan sebagai parameterinterval;
). Juga hindari lebar lebih dari 80 karakter dalam kode bila memungkinkan (hampir selalu;)new Handler(Looper.getMainLooper())
. Kedua, itu tidak memvalidasi argumen, sehingga menelan null Runnables dan interval negatif. Akhirnya, itu tidak memperhitungkan waktu yang dihabiskan diuiUpdater.run()
garis, atau menangani kemungkinan pengecualian yang dilemparkan oleh metode itu. Juga tidak aman untuk thread, Anda harus membuatstart
danstop
menyinkronkan metode.error: call to this must be first statement in constructor
mungkin ada perbaikan yang mudah.Saya pikir hotness baru adalah dengan menggunakan ScheduledThreadPoolExecutor . Seperti itu:
sumber
Executors.newSingleThreadScheduledExecutor()
bisa menjadi pilihan lain di sini.Timer bekerja dengan baik. Di sini, saya menggunakan Timer untuk mencari teks setelah 1.5s dan memperbarui UI. Semoga itu bisa membantu.
sumber
Ada 3 cara untuk melakukannya:
Gunakan ScheduledThreadPoolExecutor
Sedikit berlebihan karena Anda tidak perlu kumpulan Thread
Gunakan Pengatur Waktu
Gaya Android Lama
Gunakan Handler dan Runnable
Gaya Android Modern
Handler Non-Leaky dengan Kegiatan / Konteks
Nyatakan kelas Handler dalam yang tidak membocorkan Memori di kelas Aktivitas / Fragmen Anda
Nyatakan runnable yang akan melakukan tugas berulang Anda di kelas Activity / Fragment Anda
Inisialisasi objek Handler di Activity / Fragment Anda (di sini FlashActivity adalah kelas aktivitas saya)
Untuk mengulangi tugas setelah memperbaiki interval waktu
Untuk menghentikan pengulangan tugas
PEMBARUAN: Di Kotlin:
sumber
Timer adalah cara lain untuk melakukan pekerjaan Anda, tetapi jangan ragu untuk menambahkan
runOnUiThread
jika Anda bekerja dengan UI.dan xml adalah ...
Jadwalkan hitung mundur hingga waktu di masa mendatang, dengan pemberitahuan reguler pada interval di sepanjang jalan. Contoh menampilkan hitungan mundur 30 detik dalam bidang teks:
Untuk detail
sumber
Coba contoh berikut ini berfungsi !!!
Gunakan [Handler] dalam metode onCreate () yang memanfaatkan metode postDelayed () yang menyebabkan Runnable ditambahkan ke antrian pesan, untuk dijalankan setelah jumlah waktu yang ditentukan berlalu yaitu 0 pada contoh yang diberikan. 1
Lihat kode ini:
sumber
Anda dapat menggunakan Handler untuk mengirim kode yang bisa dijalankan. Teknik ini diuraikan dengan sangat baik di sini: https://guides.codepath.com/android/Repeating-Periodic-Tasks
sumber
Berdasarkan posting di atas mengenai ScheduledThreadPoolExecutor , saya datang dengan sebuah utilitas yang sesuai dengan kebutuhan saya (ingin menjalankan metode setiap 3 detik):
sumber
Dalam kasus saya, saya harus menjalankan proses jika salah satu dari kondisi ini benar: jika proses sebelumnya selesai atau jika 5 detik sudah berlalu. Jadi, saya melakukan yang berikut dan bekerja dengan cukup baik:
Jika process1 dibaca, ia mengeksekusi process2. Jika tidak, itu menambah waktu variabel, dan membuat Handler dieksekusi setelah satu detik. Itu memelihara sebuah loop sampai proses1 dibaca atau kali adalah 5. Ketika kali adalah 5, itu berarti bahwa 5 detik berlalu dan dalam setiap detik, jika klausa process1.isRead () dijalankan.
sumber
Menggunakan kotlin dan Coroutine-nya cukup mudah, pertama mendeklarasikan pekerjaan di kelas Anda (lebih baik di viewModel Anda) seperti ini:
maka ketika Anda ingin membuat dan memulainya lakukan ini:
dan jika Anda ingin menyelesaikannya:
PS:
viewModelScope
hanya tersedia dalam model tampilan, Anda dapat menggunakan cakupan Coroutine lain sepertiwithContext(Dispatchers.IO)
Informasi lebih lanjut: Sini
sumber
Untuk orang yang menggunakan Kotlin, jawaban inazaruk tidak akan berfungsi, IDE akan membutuhkan variabel untuk diinisialisasi, jadi alih-alih menggunakan bagian
postDelayed
dalamRunnable
, kita akan menggunakannya dalam metode yang terpisah.Inisialisasi
Runnable
seperti ini:Inisialisasi
runDelayedHandler
metode seperti ini:Seperti yang Anda lihat, pendekatan ini akan membuat Anda dapat mengontrol masa tugas, melacak
keepRunning
dan mengubahnya selama masa aplikasi akan melakukan pekerjaan untuk Anda.sumber