Saya ingin dapat memanggil metode berikut setelah penundaan yang ditentukan. Dalam tujuan c ada sesuatu seperti:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Apakah ada yang setara dengan metode ini di android dengan java? Misalnya saya harus dapat memanggil metode setelah 5 detik.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
padaHandler
.import android.os.handler
Saya tidak dapat menggunakan jawaban lain dalam kasus saya. Saya menggunakan Timer java asli sebagai gantinya.
sumber
Catatan: Jawaban ini diberikan ketika pertanyaan tidak menentukan Android sebagai konteksnya. Untuk jawaban yang spesifik untuk utas Android UI lihat di sini.
Sepertinya Mac OS API memungkinkan utas saat ini berlanjut, dan menjadwalkan tugas untuk berjalan secara tidak sinkron. Di Java, fungsi yang setara disediakan oleh
java.util.concurrent
paket. Saya tidak yakin batasan apa yang mungkin diterapkan oleh Android.sumber
ScheduledFuture<?>
dikembalikan olehworker.schedule()
dan panggilcancel(boolean)
metodenya.ScheduledExecutorService
.Untuk mengeksekusi sesuatu di UI Thread setelah 5 detik:
sumber
Anda dapat menggunakan Handler di dalam UIThread:
sumber
Terima kasih atas semua jawaban hebatnya, saya menemukan solusi yang paling sesuai dengan kebutuhan saya.
sumber
1. Menggunakan
Handler
2. Menggunakan TimerTask
Atau bahkan lebih pendek
Atau terpendek
3. Menggunakan
Executors
1. Menggunakan
Handler
2. Menggunakan
Timer
3. Menggunakan
ScheduledExecutorService
sumber
How to call a method after a delay in Android
. Jadi saya memfokuskan hal itu. Ke titik. Kalau tidak, kebocoran java adalah topik besar untuk dipahami secara terpisah untuk pengembang.Lihat demo ini:
sumber
Jika Anda harus menggunakan Handler, tetapi Anda berada di utas lain, Anda dapat menggunakan
runonuithread
untuk menjalankan handler di utas UI. Ini akan menyelamatkan Anda dari Pengecualian yang diajukan untuk meneleponLooper.Prepare()
Terlihat sangat berantakan, tetapi ini adalah salah satu caranya.
sumber
Saya lebih suka menggunakan
View.postDelayed()
metode, kode sederhana di bawah ini:sumber
Inilah solusi terpendek saya:
sumber
sumber
Jika Anda menggunakan Android Studio 3.0 dan di atasnya, Anda dapat menggunakan ekspresi lambda. Metode
callMyMethod()
ini dipanggil setelah 2 detik:Jika Anda perlu membatalkan runnable yang tertunda gunakan ini:
sumber
Saya menyarankan Timer , ini memungkinkan Anda untuk menjadwalkan metode yang akan dipanggil pada interval yang sangat spesifik. Ini tidak akan memblokir UI Anda, dan menjaga aplikasi Anda tetap beresonansi saat metode ini dijalankan.
Opsi lainnya, adalah wait (); metode, ini akan memblokir utas saat ini untuk jangka waktu yang ditentukan. Ini akan menyebabkan UI Anda berhenti merespons jika Anda melakukan ini pada utas UI.
sumber
Untuk tunda Post Menangani garis Sederhana, Anda dapat melakukan hal berikut:
saya harap ini membantu
sumber
Anda dapat menggunakan ini untuk Solusi Sederhana:
Lain, Di bawah ini bisa menjadi solusi bersih yang bermanfaat:
sumber
Anda dapat membuatnya lebih bersih dengan menggunakan ekspresi lambda yang baru diperkenalkan:
sumber
Jadi ada beberapa hal yang perlu dipertimbangkan di sini karena ada begitu banyak cara untuk menguliti kucing ini. Meskipun semua jawaban sudah diberikan dipilih dan dipilih. Saya pikir ini penting bahwa ini akan ditinjau kembali dengan pedoman pengkodean yang tepat untuk menghindari orang salah arah hanya karena "jawaban sederhana yang dipilih mayoritas".
Jadi pertama-tama mari kita bahas jawaban sederhana Post Delayed yaitu jawaban yang dipilih secara keseluruhan di utas ini.
Beberapa hal yang perlu dipertimbangkan. Setelah jeda posting, Anda dapat menemukan kebocoran memori, benda mati, siklus hidup yang telah hilang, dan banyak lagi. Jadi penanganannya dengan benar juga penting. Anda dapat melakukan ini dalam beberapa cara.
Demi perkembangan modern, saya akan memasok di KOTLIN
Berikut adalah contoh sederhana menggunakan utas UI pada panggilan balik dan mengonfirmasi bahwa aktivitas Anda masih hidup dan baik ketika Anda menekan panggilan balik Anda.
Namun, ini masih belum sempurna karena tidak ada alasan untuk menelepon balik Anda jika aktivitas telah hilang. jadi cara yang lebih baik adalah menyimpan referensi dan menghapus callbacknya seperti ini.
dan tentu saja menangani pembersihan pada onPause sehingga tidak menekan callback.
Sekarang kita telah membahas yang jelas, mari kita bicara tentang opsi yang lebih bersih dengan coroutine dan kotlin modern :). Jika Anda belum menggunakannya, Anda benar-benar ketinggalan.
atau jika Anda ingin selalu melakukan peluncuran UI pada metode itu, Anda cukup melakukannya:
Tentu saja sama seperti PostDelayed Anda harus memastikan Anda menangani pembatalan sehingga Anda dapat melakukan pemeriksaan aktivitas setelah panggilan tunda atau Anda dapat membatalkannya di onPause sama seperti rute lainnya.
// menangani pembersihan
Jika Anda memasukkan peluncuran (UI) ke dalam metode tanda tangan, pekerjaan itu dapat ditetapkan dalam baris kode panggilan.
jadi moral dari cerita ini adalah untuk aman dengan tindakan Anda yang tertunda, pastikan Anda menghapus panggilan balik Anda, atau membatalkan pekerjaan Anda dan tentu saja mengkonfirmasi Anda memiliki siklus hidup yang tepat untuk menyentuh item pada penundaan panggilan balik Anda selesai. Coroutine juga menawarkan tindakan yang dapat dibatalkan.
Juga patut dicatat bahwa Anda biasanya harus menangani berbagai pengecualian yang dapat terjadi pada coroutine. Misalnya, pembatalan, pengecualian, batas waktu, apa pun yang Anda putuskan untuk digunakan. Ini adalah contoh yang lebih maju jika Anda memutuskan untuk benar-benar mulai menggunakan coroutine.
sumber
Saya membuat metode yang lebih sederhana untuk menyebutnya.
Untuk menggunakannya, cukup hubungi:
.CallWithDelay(5000, this, "DoSomething");
sumber
performSelector
. ini adalah cara terbaik untuk melakukannya.Di bawah satu berfungsi saat Anda mendapatkan,
sumber
Menggunakan Kotlin, kita dapat mencapai dengan melakukan hal berikut
sumber
Sangat mudah menggunakan
CountDownTimer
. Untuk detail lebih lanjut https://developer.android.com/reference/android/os/CountDownTimer.htmlsumber
Jika Anda menggunakan RxAndroid maka penanganan thread dan kesalahan menjadi jauh lebih mudah. Kode berikut dijalankan setelah penundaan
sumber
semua orang tampaknya lupa untuk membersihkan Handler sebelum memposting runnable baru atau pesan di atasnya. Selain itu mereka berpotensi menumpuk dan menyebabkan perilaku buruk.
sumber
Berikut ini cara rumit lainnya: itu tidak akan membuang pengecualian ketika runnable mengubah elemen UI.
Anda dapat memanggil animasi seperti ini:
Animasi dapat dilampirkan ke tampilan apa pun.
sumber
Inilah jawaban di Kotlin Anda orang-orang malas, malas:
sumber
Saya suka hal-hal yang lebih bersih: Ini adalah implementasi saya, kode inline untuk digunakan di dalam metode Anda
sumber
Solusi yang cocok di android:
sumber
Solusi serupa tetapi lebih bersih untuk digunakan
Tulis fungsi ini di luar kelas
Pemakaian:
sumber
do
adalah metode inbuilt jadi kita harus menggunakan `untuk menggunakannya sebagai nama variabeldo
ini setelah penundaan 3 detikDi Android, kita dapat menulis kode kotlin di bawah ini untuk menunda eksekusi fungsi apa pun
sumber