Saya perlu memeriksa apakah utas yang menjalankan bagian kode tertentu adalah utas utama (UI) atau tidak. Bagaimana saya bisa mencapai ini?
Saya perlu memeriksa apakah utas yang menjalankan bagian kode tertentu adalah utas utama (UI) atau tidak. Bagaimana saya bisa mencapai ini?
Jawaban:
Looper.myLooper() == Looper.getMainLooper()
jika ini mengembalikan true, maka Anda berada di utas UI!
Anda dapat menggunakan kode di bawah ini untuk mengetahui apakah utas saat ini adalah UI / Utas utama atau tidak
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
atau Anda juga bisa menggunakan ini
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
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: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Atau, jika platform runtime adalah API level 23 (Marshmallow 6.0) atau lebih tinggi:
Looper.getMainLooper().isCurrentThread()
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
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:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
Dan, jika Anda ingin menjalankan sesuatu pada utas UI, Anda dapat menggunakan ini:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Anda bisa mengeceknya
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
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:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Setelah mengatur ini, di tempat lain dalam kode Anda, Anda dapat dengan mudah memeriksa apakah Anda akan mengeksekusi di utas utama dengan:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Agak malu saya telah mencari sebelum mengingat ini, tapi mudah-mudahan itu akan membantu orang lain!
Anda dapat memverifikasinya di android ddms logcat di mana id proses akan sama tetapi id utas akan berbeda.
Xamarin.Android
port: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Pemakaian:
if (IsMainThread) {
// you are on UI/Main thread
}
Anda dapat mencoba Thread.currentThread (). IsDaemon ()