मुझे यह जाँचने की आवश्यकता है कि कोड का एक निश्चित टुकड़ा चलने वाला धागा मुख्य (UI) धागा है या नहीं। इसे कैसे प्राप्त किया जा सकता है?
मुझे यह जाँचने की आवश्यकता है कि कोड का एक निश्चित टुकड़ा चलने वाला धागा मुख्य (UI) धागा है या नहीं। इसे कैसे प्राप्त किया जा सकता है?
जवाबों:
Looper.myLooper() == Looper.getMainLooper()
अगर यह सच है, तो आप UI थ्रेड पर हैं!
आप नीचे दिए गए कोड का उपयोग यह जानने के लिए कर सकते हैं कि करंट थ्रेड UI / मेन थ्रेड है या नहीं
if(Looper.myLooper() == Looper.getMainLooper()) {
// Current Thread is Main Thread.
}
या आप इसका उपयोग भी कर सकते हैं
if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
// Current Thread is Main Thread.
}
Looper.myLooper()
यदि थ्रेड लूपर से संबद्ध नहीं है, तो अशक्त हो जाएगा। तो दोनों सुरक्षित हैं और एक ही परिणाम है, लेकिन पहले वाला थोड़ा धीमा है, जबकि यह लूपर और उससे जुड़े धागे का पता लगाने और कुछ अन्य सामान करने के लिए एक नक्शे के अंदर खोज करता है।
सबसे अच्छा तरीका सबसे स्पष्ट, सबसे मजबूत तरीका है: *
Thread.currentThread().equals( Looper.getMainLooper().getThread() )
या, यदि रनटाइम प्लेटफॉर्म एपीआई स्तर 23 (मार्शमैलो 6.0) या उच्चतर है:
Looper.getMainLooper().isCurrentThread()
लूपर एपीआई देखें । ध्यान दें कि कॉलिंग Looper.getMainLooper()
में सिंक्रनाइज़ेशन ( स्रोत देखें ) शामिल है। आप रिटर्न वैल्यू को स्टोर करके और उसका पुनः उपयोग करके ओवरहेड से बचना चाह सकते हैं।
* क्रेडिट greg7gkb और 2cupsOfTech
Looper.myLooper() == Looper.getMainLooper()
, जो मुझे लगता है कि कम स्पष्ट है। मैं क्रेडिट greg7gkb।
समाधान को संक्षेप में, मुझे लगता है कि यह सबसे अच्छा है:
boolean isUiThread = VERSION.SDK_INT >= VERSION_CODES.M
? Looper.getMainLooper().isCurrentThread()
: Thread.currentThread() == Looper.getMainLooper().getThread();
और, यदि आप UI थ्रेड पर कुछ चलाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
//this runs on the UI thread
}
});
आप देख सकते हैं
if(Looper.myLooper() == Looper.getMainLooper()) {
// You are on mainThread
}else{
// you are on non-ui thread
}
मुझे इसके साथ प्रस्तुत करने की अनुमति दें: मैंने स्वीकार किया कि इस पोस्ट में 'Android' टैग है, हालांकि, मेरी खोज का 'Android' से कोई लेना-देना नहीं था और यह मेरा शीर्ष परिणाम था। अंत में, गैर-एंड्रॉइड एसओ जावा उपयोगकर्ताओं के लिए यहां लैंडिंग करना, इसके बारे में मत भूलना:
public static void main(String[] args{
Thread.currentThread().setName("SomeNameIChoose");
/*...the rest of main...*/
}
इसे सेट करने के बाद, कहीं और अपने कोड में, आप आसानी से जांच सकते हैं कि आप मुख्य थ्रेड के साथ निष्पादित करने वाले हैं या नहीं:
if(Thread.currentThread().getName().equals("SomeNameIChoose"))
{
//do something on main thread
}
थोड़ा सा शर्मिंदा मैंने इसे याद करने से पहले खोजा था, लेकिन उम्मीद है कि यह किसी और की मदद करेगा!
आप इसे android ddms logcat में सत्यापित कर सकते हैं जहाँ प्रोसेस आईडी समान होगी लेकिन थ्रेड आईडी अलग होगी।
Xamarin.Android
पोर्ट: ( C#
)
public bool IsMainThread => Build.VERSION.SdkInt >= BuildVersionCodes.M
? Looper.MainLooper.IsCurrentThread
: Looper.MyLooper() == Looper.MainLooper;
उपयोग:
if (IsMainThread) {
// you are on UI/Main thread
}
आप Thread.currentThread () .DDemon () आज़मा सकते हैं