Belirli bir kod parçasını çalıştıran iş parçacığı ana (UI) iş parçacığı olup olmadığını kontrol etmek gerekir. Bunu nasıl başarabilirim?
Belirli bir kod parçasını çalıştıran iş parçacığı ana (UI) iş parçacığı olup olmadığını kontrol etmek gerekir. Bunu nasıl başarabilirim?
Yanıtlar:
Looper.myLooper() == Looper.getMainLooper()
bu doğruysa, kullanıcı arayüzünde olursunuz!
mevcut iş parçacığının UI / Ana iş parçacığı olup olmadığını öğrenmek için aşağıdaki kodu kullanabilirsiniz
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
veya bunu da kullanabilirsiniz
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
iş parçacığı bir Lüper ile ilişkili değilse null değerini döndürür. Bu yüzden her ikisi de güvenlidir ve aynı sonuca sahiptir, ancak birincisi, lüper ve onunla ilişkili iş parçacığını bulmak ve başka şeyler yapmak için bir harita içinde ararken biraz daha yavaştır.
En iyi yol en net, en sağlam yol: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
Veya çalışma zamanı platformu API düzey 23 (Marshmallow 6.0) veya daha yüksekse:
Looper.getMainLooper().isCurrentThread()
Lüper API'sine bakın . Looper.getMainLooper()
Çağrının senkronizasyon içerdiğini unutmayın ( kaynağa bakın ). Dönüş değerini kaydedip yeniden kullanarak ek yükten kaçınmak isteyebilirsiniz.
* kredi greg7gkb ve 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
daha az net olduğunu düşünüyorum. Ben greg7gkb kredi.
equals
ve geri düştüğü için şu anda her iki test de çalışma zamanında aynıdır ==
, ancak bu gelecekte değişebilir. Bu yüzden cevabı düzelttim.
Çözümleri özetlersek, bunun en iyisi olduğunu düşünüyorum:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
UI iş parçacığında bir şey çalıştırmak istiyorsanız, bunu kullanabilirsiniz:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
Kontrol edebilirsin
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
Bunu önceden yazmama izin ver: Bu yayının 'Android' etiketine sahip olduğunu kabul ettim, ancak aramamın 'Android' ile ilgisi yoktu ve bu benim en iyi sonucumdu. Bu amaçla, buraya gelen Android olmayan SO Java kullanıcıları için şunları unutmayın:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
Bunu ayarladıktan sonra, kodunuzun başka bir yerinde, ana iş parçacığında aşağıdakilerle yürütmek üzere olup olmadığınızı kolayca kontrol edebilirsiniz:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
Bunu hatırlamadan önce biraz utandım, ama umarım başka birine yardımcı olur!
süreç kimliği aynı olacak ama iş parçacığı kimliği farklı olacak android ddms logcat doğrulayabilirsiniz.
Xamarin.Android
bağlantı noktası: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
Kullanımı:
if (IsMainThread) {
// you are on UI/Main thread
}
Thread.currentThread (). Deneyebilirsiniz isDaemon ()