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.

ParDroid
sumber
Lihat jawaban saya di sini: stackoverflow.com/a/41280460/878126
pengembang android

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.
}
mik3y
sumber
6
stackoverflow.com/questions/11411022/… Jawaban ini bagus juga)
UnknownJoe
44

Saya pikir cara terbaik adalah ini:

 if (Looper.getMainLooper().equals(Looper.myLooper())) {
     // UI thread
 } else {
     // Non UI thread
 }
Atom
sumber
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.

stan0
sumber
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
}
yushulx
sumber
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

Ridoy
sumber
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