Saya ingin membuat jeda di antara dua baris kode, Biarkan saya jelaskan sedikit:
-> pengguna mengklik tombol (kartu sebenarnya) dan saya menunjukkannya dengan mengubah latar belakang tombol ini:
thisbutton.setBackgroundResource(R.drawable.icon);
-> setelah misalkan 1 detik, saya harus kembali ke keadaan tombol sebelumnya dengan mengubah latar belakangnya:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> Saya sudah mencoba menjeda utas antara dua baris kode ini dengan:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Namun, ini tidak berhasil. Mungkin prosesnya dan bukan Thread yang perlu saya hentikan?
Saya juga sudah mencoba (tetapi tidak berhasil):
new Reminder(5);
Dengan ini:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Bagaimana saya bisa menjeda / tidur utas atau proses?
android
process
multithreading
Hubert
sumber
sumber
(!conditionCheck()) {}
biasanya berkecil hati.Jawaban:
Salah satu solusi untuk masalah ini adalah dengan menggunakan metode Handler.postDelayed () . Beberapa materi pelatihan Google menyarankan solusi yang sama.
Namun, beberapa telah menunjukkan bahwa solusi di atas menyebabkan kebocoran memori karena menggunakan kelas non-statis dalam dan anonim yang secara implisit memegang referensi ke kelas luarnya, aktivitas. Ini adalah masalah ketika konteks aktivitasnya adalah pengumpulan sampah.
Solusi yang lebih kompleks yang menghindari kebocoran memori mengelompokkan
Handler
danRunnable
dengan kelas dalam statis di dalam aktivitas karena kelas statis dalam tidak memegang referensi implisit ke kelas luar mereka:Perhatikan bahwa
Runnable
menggunakan WeakReference to Activity, yang diperlukan di kelas statis yang membutuhkan akses ke UI.sumber
final Button mynewbutton = mybutton;
dan gunakanmynewbutton
di Handler dan Runnable dari sana.Anda dapat mencoba yang ini pendek
PERINGATAN : Tidak pernah, lakukan ini di utas UI.
Gunakan ini untuk tidur misalnya. utas latar belakang.
Solusi lengkap untuk masalah Anda adalah: Ini tersedia API 1
Tanpa membuat tmp Handler. Juga solusi ini lebih baik daripada @tronman karena kami tidak mempertahankan pandangan oleh Handler. Juga kami tidak memiliki masalah dengan Handler dibuat di utas buruk;)
Dokumentasi
Kode untuk postDelayed dari View class:
sumber
OMG of course do this in background thread
tidak relevan, kecuali jika Anda menunjukkan BAGAIMANA memasukkannya ke utas latar. Pada saat itu, Anda akan menemukan bahwa Anda memiliki jawaban yang lebih rumit daripada jawaban yang sudah diterima. Apakah saya menyebutkan bahwa solusi yang lebih baik diterima tiga tahun lalu? : PHandler + postRunnable
menyelesaikan semua ini, dalam satu langkah. Tanpa overhead sistem untuk membuat utas kedua.Saya menggunakan ini:
sumber
e.getLocalizedMessage()
seharusnya dilakukan?Handler/postDelayed
Solusi yang diterima memiliki dua keunggulan: (1) menghindari overhead sistem ke-2 utas, (1) berjalan pada utas UI, sehingga dapat membuat perubahan UI tanpa menyebabkan pengecualian.Anda mungkin tidak ingin melakukannya dengan cara itu. Dengan menempatkan eksplisit
sleep()
di pengendali event yang diklik tombol Anda, Anda benar-benar akan mengunci seluruh UI selama satu detik. Salah satu alternatif adalah menggunakan semacam Timer sekali pakai . Buat TimerTask untuk mengubah warna latar belakang kembali ke warna default, dan jadwalkan pada Timer.Kemungkinan lain adalah menggunakan Handler . Ada tutorial tentang seseorang yang beralih dari menggunakan Timer ke menggunakan Handler.
Secara kebetulan, Anda tidak dapat menjeda proses. Proses Java (atau Android) memiliki setidaknya 1 utas, dan Anda hanya dapat tidur utas.
sumber
Saya menggunakan CountDownTime
sumber
Inilah yang saya lakukan pada akhir hari - bekerja dengan baik sekarang:
sumber
Selain jawaban Mr. Yankowsky, Anda juga bisa menggunakan
postDelayed()
. Ini tersedia pada semuaView
(mis. Kartu Anda) dan membutuhkan waktuRunnable
dan penundaan. Itu mengeksekusiRunnable
setelah penundaan itu.sumber
Ini adalah contoh saya
Buat Utils Java
sumber
Atau Anda bisa menggunakan:
yang memiliki keuntungan tidak memerlukan pembungkus
try ... catch
.sumber
Jika Anda menggunakan Kotlin dan coroutine , Anda bisa melakukannya
Dan jika Anda perlu memperbarui UI
sumber
Saya tahu ini adalah utas lama, tetapi dalam dokumentasi Android saya menemukan solusi yang bekerja sangat baik untuk saya ...
https://developer.android.com/reference/android/os/CountDownTimer.html
Semoga ini bisa membantu seseorang ...
sumber
Dan untuk menjadi dobel yakin Anda dapat dikombinasikan dengan metode "kelas statis" seperti yang dijelaskan dalam jawaban tronman
sumber