runOnUiThread vs Looper.getMainLooper (). posting di Android

99

Adakah yang bisa memberi tahu saya jika ada perbedaan antara menggunakan runOnUiThread () versus Looper.getMainLooper (). Post () untuk menjalankan tugas di thread UI di Android ??

Tentang satu-satunya hal yang dapat saya tentukan adalah bahwa karena runOnUiThread adalah metode Aktivitas non-statis, Looper.getMainLooper (). Post () lebih nyaman ketika Anda perlu membuat kode sesuatu di kelas yang tidak dapat melihat Aktivitas (seperti antarmuka).

Saya tidak sedang mencari diskusi tentang APAKAH sesuatu harus dijalankan pada UI thread, saya mengerti bahwa beberapa hal tidak dapat dan banyak hal yang tidak seharusnya, namun beberapa hal (seperti memulai AsyncTask) HARUS dijalankan dari utas UI.

Terima kasih,
R.

Kaya
sumber
6
Tidak ada perbedaan kecuali yang runOnUiThreadakan memeriksa apakah itu sudah menjadi UI thread dan menjalankan tugas Anda secara langsung alih-alih mempostingnya sebagaiMessage
zapl
1
Terima kasih. Bisakah Anda mengubahnya menjadi jawaban, jadi saya bisa menerimanya ??
Kaya
Selain itu, saya telah menulis beberapa kode untuk memeriksa apakah ada sesuatu yang sedang dieksekusi di thread UI, jadi akan sangat mudah untuk memasukkannya secara manual.
Kaya

Jawaban:

192

Perilaku berikut ini sama saat dipanggil dari thread latar belakang:

  • menggunakan Looper.getMainLooper()

    Runnable task = getTask();
    new Handler(Looper.getMainLooper()).post(task);
    
  • menggunakan Activity#runOnUiThread()

    Runnable task = getTask();
    runOnUiThread(task);
    

Satu-satunya perbedaan adalah ketika Anda melakukannya dari thread UI sejak itu

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

akan memeriksa apakah Thread saat ini sudah menjadi thread UI dan kemudian menjalankannya secara langsung. Mempostingnya sebagai pesan akan menunda eksekusi sampai Anda kembali dari metode UI-thread saat ini.

Ada juga cara ketiga untuk mengeksekusi Runnabledi thread UI yaitu View#post(Runnable)- cara ini akan selalu memposting pesan bahkan saat dipanggil dari thread UI. Itu berguna karena itu akan memastikan bahwa Viewtelah dibangun dengan benar dan memiliki tata letak sebelum kode dijalankan.

zapl
sumber