Apa perbedaan antara Activity.runOnUiThreaddan View.post, bisakah seseorang, tolong, jelaskan?
Apa perbedaan antara Activity.runOnUiThreaddan View.post, bisakah seseorang, tolong, jelaskan?
Jawaban:
Tidak ada perbedaan nyata, kecuali bahwa View.postberguna ketika Anda tidak memiliki akses langsung ke aktivitas.
Dalam kedua kasus, jika tidak pada UI thread, Handler#post(Runnable)akan dipanggil di belakang layar.
Seperti yang disebutkan CommonsWare dalam komentar, ada perbedaan antara keduanya - ketika dipanggil di utas Ui, Activity#runOnUiThreadakan memanggil runmetode secara langsung, sementara View#postakan memposting runnabledi antrian (misalnya memanggil Handler#post)
Poin penting IMO adalah keduanya memiliki tujuan yang sama, dan untuk siapa pun yang menggunakannya, tidak boleh ada perbedaan (dan implementasinya dapat berubah di masa mendatang).
runOnUiThread()memeriksa utas saat ini dan Runnablesegera mengeksekusinya jika kita kebetulan berada di utas aplikasi utama. post()selalu menempatkan Runnableantrean, tidak peduli utas apa yang dipanggil.
runOnUiThread()periksa utas saat ini dan Runnablesegera jalankan jika kami kebetulan berada di utas aplikasi utama " (penekanan ditambahkan). "Apakah ini berarti bahwa apa pun yang saat ini ada di thread UI diabaikan dan ini diberi prioritas pertama?" - "apa yang pernah saat di thread UI" adalah yang runOnUiThread()panggilan.
Perbedaan lain antara Activity.runOnUiThread dan view.post () adalah runnable di view.post () dipanggil setelah tampilan dilampirkan ke jendela.
Baik yang diterima untuk kebanyakan situasi dan untuk sebagian besar mereka dipertukarkan, tetapi mereka yang agak berbeda. Perbedaan terbesar tentu saja adalah bahwa yang satu tersedia dari Activitydan yang lainnya dari a View. Ada banyak tumpang tindih di antara keduanya, tetapi terkadang dalam sebuah ActivityAnda tidak akan memiliki akses ke View, dan terkadang dalam sebuah ViewAnda tidak akan memiliki akses ke Activity.
Salah satu kasus tepi yang saya temui View.postsaya sebutkan dalam jawaban untuk pertanyaan SO lain tentangView.post : View.posthanya berfungsi dari utas lain ketika Viewdilampirkan ke jendela. Ini jarang masalah, tapi kadang-kadang dapat menyebabkan Runnableuntuk tidak pernah mengeksekusi, terutama jika Anda memanggil View.postdalam onCreatemetode Anda Activity. Alternatifnya adalah dengan menggunakan Handler.postapa Activity.runOnUiThreaddan tetap View.postdigunakan di bawah selimut.
(diedit untuk akurasi, ditambahkan "dari utas lain")
onCreate()juga? Hm, saya berharap untuk memposting ke yang Handlerdisediakan oleh ViewRootdalam kasus itu.
View.postharus menambahkan Runnableantrian untuk dieksekusi nanti jika belum terpasang. Saya belum menggali lebih dalam di sumbernya, tetapi dokumen mengatakan: "Metode ini dapat dipanggil dari luar thread UI hanya jika Tampilan ini dilampirkan ke jendela." Jadi saya pikir jika itu di utas saat ini, maka apa yang Anda katakan itu benar, jika tidak maka itu mungkin hanya menelan Runnable. Saya pasti pernah mengalami itu di kode saya.