Bagaimana cara mendeteksi utas UI di Android?


117

Apakah ada cara yang ampuh untuk mendeteksi apakah Thread.currentThread()thread UI sistem Android ada dalam aplikasi?
Saya ingin memasukkan beberapa pernyataan dalam kode model saya yang menegaskan bahwa hanya satu utas ( misalnya utas ui) yang mengakses negara saya, untuk memastikan bahwa tidak ada jenis sinkronisasi yang diperlukan.


Jawaban:


199

Praktik umum untuk menentukan identitas UI Thread adalah melalui Looper # getMainLooper :

if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}

Dari API level 23 dan lebih tinggi, ada pendekatan yang sedikit lebih mudah dibaca menggunakan metode helper baru isCurrentThread di looper utama:

if (Looper.getMainLooper().isCurrentThread()) {
  // On UI thread.
} else {
  // Not on UI thread.
}


44

Saya pikir cara terbaik adalah ini:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }

Bekerja dengan baik. Terima kasih!
Hong

3
Tidak perlu menggunakan equalskarena kami hanya membandingkan referensi, dan yang terpenting, keduanya statis.
mr5

8

Pada API level 23 Loopermemiliki metode pembantu yang bagus isCurrentThread. Anda bisa mendapatkan mainLooperdan melihat apakah itu yang untuk utas saat ini dengan cara ini:

Looper.getMainLooper().isCurrentThread()

Ini praktis sama dengan:

Looper.getMainLooper().getThread() == Thread.currentThread()

tapi bisa sedikit lebih mudah dibaca dan diingat.



2

Selain memeriksa looper , jika Anda pernah mencoba untuk logout id thread onCreate(), Anda dapat menemukan ID thread UI (utas utama) selalu sama dengan 1. Oleh karena itu

if (Thread.currentThread().getId() == 1) {
    // UI thread
}
else {
    // other thread
}

Saya tidak dapat menemukan dokumentasi resmi yang menguatkan bahwa ini benar, dan akan selalu demikian. Apakah kamu punya link
intrepidis

Inilah yang saya temukan di logcat ketika saya ingin memantau perilaku multi-utas. Anda dapat mencoba mengeluarkan id utas
yushulx

8
Saya sangat menyarankan untuk tidak melakukannya, karena nilai ini mungkin khusus untuk perangkat Anda dan / atau versi Android. Bahkan jika itu terjadi pada setiap perangkat Android saat ini, tidak ada jaminan bahwa itu akan terus terjadi di versi yang lebih baru. Menyimpan ID utas di anggota kelas saat menjalankan onCreate () tampaknya sedikit lebih masuk akal bagi saya.
personne3000

1

Tidak bisakah Anda menggunakan runOnUiThreadmetode diActivity kelas? Lihat ..

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29


4
Aplikasi saya berfungsi, tetapi memiliki beberapa penulis dan menjadi agak besar dan kompleks. Yang ingin saya lakukan adalah menambahkan jaring pengaman ekstra, pernyataan yang menangkap kesalahan taruhan jika seseorang memanggil metode yang dirancang hanya untuk dipanggil dari GUI-thread dari thread lain.
ParDroid

Saat ini saya memperbaiki bug di mana menggunakan runOnUiThread menyebabkan UX berkedip.
fobbymaster
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.