Saya perlu memeriksa apakah utas yang menjalankan bagian kode tertentu adalah utas utama (UI) atau tidak. Bagaimana saya bisa mencapai ini?
java
android
multithreading
Charlie-Blake
sumber
sumber
Jawaban:
jika ini mengembalikan true, maka Anda berada di utas UI!
sumber
Anda dapat menggunakan kode di bawah ini untuk mengetahui apakah utas saat ini adalah UI / Utas utama atau tidak
atau Anda juga bisa menggunakan ini
Ini pertanyaan serupa
sumber
Looper.myLooper()
akan mengembalikan nol jika utas tidak dikaitkan dengan Looper. Jadi keduanya aman dan memiliki hasil yang sama tetapi yang pertama sedikit lebih lambat saat mencari di dalam peta untuk mengetahui looper dan utas terkait dan melakukan beberapa hal lainnya.Cara terbaik adalah cara yang paling jelas, paling kuat: *
Atau, jika platform runtime adalah API level 23 (Marshmallow 6.0) atau lebih tinggi:
Lihat Looper API . Perhatikan bahwa panggilan
Looper.getMainLooper()
melibatkan sinkronisasi (lihat sumbernya ). Anda mungkin ingin menghindari overhead dengan menyimpan nilai kembali dan menggunakannya kembali.* kredit greg7gkb dan 2cupsOfTech
sumber
Looper.myLooper() == Looper.getMainLooper()
, yang menurut saya kurang jelas. Saya kredit greg7gkb.equals
, dan jatuh kembali ke==
, tetapi itu bisa berubah di masa depan. Jadi saya mengoreksi jawabannya.Merangkum solusi, saya pikir itu yang terbaik:
Dan, jika Anda ingin menjalankan sesuatu pada utas UI, Anda dapat menggunakan ini:
sumber
Anda bisa mengeceknya
sumber
Izinkan saya untuk mengawali ini dengan: Saya mengakui posting ini memiliki tag 'Android', namun, pencarian saya tidak ada hubungannya dengan 'Android' dan ini adalah hasil teratas saya. Untuk itu, untuk pengguna SO Java non-Android yang mendarat di sini, jangan lupakan:
Setelah mengatur ini, di tempat lain dalam kode Anda, Anda dapat dengan mudah memeriksa apakah Anda akan mengeksekusi di utas utama dengan:
Agak malu saya telah mencari sebelum mengingat ini, tapi mudah-mudahan itu akan membantu orang lain!
sumber
Anda dapat memverifikasinya di android ddms logcat di mana id proses akan sama tetapi id utas akan berbeda.
sumber
Xamarin.Android
port: (C#
)Pemakaian:
sumber
Anda dapat mencoba Thread.currentThread (). IsDaemon ()
sumber