कैसे जांच करें कि क्या वर्तमान धागा मुख्य धागा नहीं है


391

मुझे यह जाँचने की आवश्यकता है कि कोड का एक निश्चित टुकड़ा चलने वाला धागा मुख्य (UI) धागा है या नहीं। इसे कैसे प्राप्त किया जा सकता है?


उदाहरण के लिए धागे के साथ प्रदर्शित करने के लिए कोड code2concept.blogspot.in/2015/02/…
nitesh

जवाबों:



122

आप नीचे दिए गए कोड का उपयोग यह जानने के लिए कर सकते हैं कि करंट थ्रेड UI / मेन थ्रेड है या नहीं

if(Looper.myLooper() == Looper.getMainLooper()) {
   // Current Thread is Main Thread.
}

या आप इसका उपयोग भी कर सकते हैं

if(Looper.getMainLooper().getThread() == Thread.currentThread()) {
   // Current Thread is Main Thread.
}

यहाँ भी ऐसा ही सवाल है


8
क्या किसी को बाद वाले को सुरक्षित विकल्प के रूप में माना जाना चाहिए क्योंकि कोई गारंटी नहीं है कि कोई भी मनमाना धागा लूपर के साथ जुड़ा हुआ है (यह मानते हुए कि मुख्य धागा हमेशा लूपर के साथ जुड़ा हुआ है)?
जानुस वर्मकरन

Looper.myLooper()यदि थ्रेड लूपर से संबद्ध नहीं है, तो अशक्त हो जाएगा। तो दोनों सुरक्षित हैं और एक ही परिणाम है, लेकिन पहले वाला थोड़ा धीमा है, जबकि यह लूपर और उससे जुड़े धागे का पता लगाने और कुछ अन्य सामान करने के लिए एक नक्शे के अंदर खोज करता है।
सईद मासौमी

59

सबसे अच्छा तरीका सबसे स्पष्ट, सबसे मजबूत तरीका है: *

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

या, यदि रनटाइम प्लेटफॉर्म एपीआई स्तर 23 (मार्शमैलो 6.0) या उच्चतर है:

Looper.getMainLooper().isCurrentThread()

लूपर एपीआई देखें । ध्यान दें कि कॉलिंग Looper.getMainLooper()में सिंक्रनाइज़ेशन ( स्रोत देखें ) शामिल है। आप रिटर्न वैल्यू को स्टोर करके और उसका पुनः उपयोग करके ओवरहेड से बचना चाह सकते हैं।

   * क्रेडिट greg7gkb और 2cupsOfTech


"एपीआई 23 या उच्चतर के तहत" से आपका क्या अभिप्राय है? इससे मुझे कोई मतलब नहीं है..क्योंकि उसी जवाब का जवाब नीचे एन्नकिट द्वारा दिया गया था ..
माइक

@ माइक धन्यवाद, मैंने एपीआई बिट को ठीक किया। AAnkit वास्तव में एहसान करता है Looper.myLooper() == Looper.getMainLooper(), जो मुझे लगता है कि कम स्पष्ट है। मैं क्रेडिट greg7gkb।
माइकल एलन

1
क्या यह == या बराबर () के साथ तुलना होना चाहिए क्योंकि एंड्रॉइड स्टूडियो एक चेतावनी उठा रहा है?
2cupsOfTech

@ 2cupsOfTech 2nd पर सोचा, यह अच्छी सलाह है। वर्तमान में दोनों परीक्षण रनटाइम पर समान हैं क्योंकि थ्रेड ओवरराइड नहीं करता है equals, और इसलिए वापस गिरता है ==, लेकिन यह भविष्य में बदल सकता है। तो मैंने जवाब सही दिया।
माइकल एलन

25

समाधान को संक्षेप में, मुझे लगता है कि यह सबसे अच्छा है:

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
    }
});


2

मुझे इसके साथ प्रस्तुत करने की अनुमति दें: मैंने स्वीकार किया कि इस पोस्ट में '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
}

थोड़ा सा शर्मिंदा मैंने इसे याद करने से पहले खोजा था, लेकिन उम्मीद है कि यह किसी और की मदद करेगा!


1

आप इसे android ddms logcat में सत्यापित कर सकते हैं जहाँ प्रोसेस आईडी समान होगी लेकिन थ्रेड आईडी अलग होगी।


1

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
}

-6

आप Thread.currentThread () .DDemon () आज़मा सकते हैं


मुझे यकीन नहीं है कि यूआई धागा एक डेमॉन है, लेकिन मैं आपको इस पर विश्वास करूंगा। लेकिन आप एक डेमन थ्रेड के साथ अंतर कैसे बना पाएंगे जो मैं (लेकिन नहीं करना चाहिए) बना सकता हूं।
एक्सलह

मैंने अपने वेब ऐप में परीक्षण किया, यह दर्शाता है कि UI थ्रेड एक डेमन थ्रेड है। मैंने ग्रहण पर्यावरण में कुछ डिबग ब्रेक पॉइंट डाले और इसे सत्यापित किया। थ्रेड विस्तार को थ्रेड के रूप में दिखाया गया [http-बायो -8080-एग्जीक्यूट -7,5, मुख्य]। कुछ UI पृष्ठों पर क्लिक किया और डीबग बिंदु की जाँच की।
शैलेंद्र सिंह

इसके अलावा, भले ही थ्रेड नाम में इसकी 'मुख्य' दिखाई दे रही हो लेकिन थ्रेड ऑब्जेक्ट पर सेटडोमन (ट्रू) को कॉल करना इसे डेमॉन बना देगा।
शैलेंद्र सिंह

आपने अच्छा हिस्सा नहीं पढ़ा ... मुझे संदेह नहीं था (पूरी तरह से) इसके बारे में एक डेमॉन होने के नाते, मैं बता रहा था कि आप इस तरह के अन्य डेमन थ्रेड के साथ अंतर नहीं कर सकते।
एक्सलएच

दूसरा तरीका रखो: एक मुख्य धागा एक डेमन धागा हो सकता है, लेकिन सभी डेमन धागे मुख्य धागा नहीं हैं। (मुख्य सूत्र को पहचानना वही है जो यहां पूछा जा रहा है।)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.