Android'de UI iş parçacığı nasıl tespit edilir?


117

Thread.currentThread()Android sistem kullanıcı arayüzü iş parçacığının bir uygulamada olup olmadığını tespit etmenin sağlam bir yolu var mı ?
Model koduma, herhangi bir senkronizasyonun gerekli olmadığından emin olmak için sadece bir iş parçacığının ( örneğin , ui iş parçacığının) durumuma eriştiğini iddia eden bazı iddialar eklemek istiyorum .


Yanıtlar:


199

Kullanıcı Arabirimi İş Parçacığının kimliğini belirlemeye yönelik yaygın uygulama, Looper # getMainLooper yoluyla yapılır :

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

API seviyesi 23 ve üzeri, ana döngü yapıcıda yeni yardımcı yöntem olan isCurrentThread kullanan biraz daha okunaklı bir yaklaşım var :

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


44

Bence en iyi yol şudur:

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

Harika çalışıyor. Teşekkür ederim!
Hong

3
Kullanmaya gerek yok equalsçünkü sadece referansları karşılaştırıyoruz ve üstelik ikisi de statik.
mr5

8

API seviyesi 23'ten itibaren Loopergüzel bir yardımcı metoda sahiptir isCurrentThread. Şu mainLooperyolla mevcut iş parçacığı için olanı alabilir ve görebilirsiniz:

Looper.getMainLooper().isCurrentThread()

Neredeyse aynı:

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

ama biraz daha okunaklı ve hatırlaması daha kolay olabilir.



2

Kontrol yanında lüpere Hiç çalışırsa, çıkış iplik kimliği içinde onCreate(), sen bulabildiğim UI iş parçacığı (ana iş parçacığı) id hep nedenle 1'e eşittir

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

Bunun doğru olduğunu doğrulayan herhangi bir resmi belge bulamıyorum ve her zaman öyle kalacaktır. Bağlantınız var mı?
intrepidis

Çoklu iş parçacığı davranışını izlemek istediğimde logcat'te bulduğum şey bu. İş parçacığı kimliğini
çıkarmayı

8
Bu değer cihazınıza ve / veya Android sürümünüze özel olabileceğinden, buna şiddetle karşı çıkmanızı öneririm. Şu anda her Android cihazda durum böyle olsa bile, sonraki sürümlerde de böyle olmaya devam edeceğinin garantisi yok. OnCreate () çalıştırılırken iş parçacığı kimliğini bir sınıf üyesine kaydetmek bana biraz daha mantıklı geliyor.
personne3000

1

runOnUiThreadYöntemi Activitysınıfta kullanamaz mısın? Bakınız ..

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


4
Başvurum çalışıyor, ancak birkaç yazarı var ve oldukça büyük ve karmaşık hale geliyor. Yapmak istediğim, fazladan bir güvenlik ağı eklemek, birisi başka bir iş parçacığından yalnızca GUI iş parçacığından çağrılmak üzere tasarlanmış bir yöntemi çağırdığında yanlış anlaşmayı yakalayan bir iddia.
ParDroid

Şu anda runOnUiThread kullanımının UX'in yanıp sönmesine neden olduğu bir hatayı düzeltiyorum.
fobbymaster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.