Android पर UI थ्रेड का पता कैसे लगाएं?


117

क्या पता लगाने का एक मजबूत तरीका Thread.currentThread()है कि एंड्रॉइड सिस्टम यूआई थ्रेड किसी एप्लिकेशन में है या नहीं?
मैं अपने मॉडल कोड में कुछ दावे करना चाहता हूं कि यह दावा करता है कि केवल एक धागा ( जैसे ui धागा) मेरे राज्य तक पहुंचता है, यह आश्वस्त करने के लिए कि किसी प्रकार का सिंक्रनाइज़ेशन आवश्यक नहीं है।


मेरा जवाब यहां देखें: stackoverflow.com/a/41280460/878126
Android डेवलपर

जवाबों:


199

UI थ्रेड की पहचान निर्धारित करने के लिए सामान्य अभ्यास Looper # getMainLooper के माध्यम से होता है :

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

एपीआई स्तर 23 और ऊपर से, वहाँ एक से थोड़ा अधिक पठनीय नई सहायक विधि का उपयोग तरीका है isCurrentThread मुख्य looper पर:

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

6
stackoverflow.com/questions/11411022/… यह उत्तर भी अच्छा है)
अज्ञात

44

मुझे लगता है कि यह सबसे अच्छा तरीका है:

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

बहुत अच्छा काम करता है। धन्यवाद!
हाँग

3
equalsजब से हम केवल संदर्भों की तुलना कर रहे हैं, और उसके शीर्ष पर, दोनों स्थिर हैं, तब से उपयोग करने की आवश्यकता नहीं है ।
mr5

8

एपीआई स्तर 23 के रूप Looperमें एक अच्छा सहायक तरीका है isCurrentThread। आप mainLooperइसे प्राप्त कर सकते हैं और देख सकते हैं कि क्या यह वर्तमान थ्रेड के लिए इस तरह से है:

Looper.getMainLooper().isCurrentThread()

यह व्यावहारिक रूप से समान है:

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

लेकिन यह थोड़ा अधिक पठनीय और याद रखने में आसान हो सकता है।



2

जाँच इसके अलावा looper , अगर आप कभी भी करने की कोशिश की लॉगआउट में धागा आईडी onCreate(), तुम मिल सकता है यूआई धागा (मुख्य थ्रेड) आईडी हमेशा 1. इसलिए करने के लिए बराबर होती है

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

मुझे कोई आधिकारिक दस्तावेज नहीं मिला है जो यह पुष्टि करता है कि यह सच है, और हमेशा ऐसा रहेगा। क्या आपके पास एक लिंक है?
intrepidis

जब मैं मल्टी-थ्रेड व्यवहार की निगरानी करना चाहता हूं तो यह मुझे लॉगकोट में मिला। आप थ्रेड आईडी
yushulx

8
मैं इसके खिलाफ दृढ़ता से अनुशंसा करूंगा, क्योंकि यह मान आपके डिवाइस और / या Android के संस्करण के लिए विशिष्ट हो सकता है। यहां तक ​​कि अगर यह अभी हर एंड्रॉइड डिवाइस पर मामला था, तो इस बात की कोई गारंटी नहीं है कि यह बाद के संस्करणों में ऐसा ही रहेगा। OnCreate () चलाते समय एक क्लास मेंबर में थ्रेड आईडी को सेव करना मेरे लिए थोड़ा अधिक उचित लगता है।
personne3000

1

क्या आप कक्षा runOnUiThreadमें विधि का उपयोग नहीं कर सकते Activity? देखें ..

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


4
मेरा आवेदन काम कर रहा है, लेकिन, इसके कई लेखक हैं और यह बड़ा और जटिल है। मैं जो करना चाहता हूं वह एक अतिरिक्त सुरक्षा जाल को जोड़ना है, एक जोर लगाना जो गलतफहमी को पकड़ता है अगर कोई ऐसा तरीका बुला रहा है जिसे केवल एक और धागे से जीयूआई-थ्रेड से डिज़ाइन करने के लिए डिज़ाइन किया गया है।
ParDroid

मैं वर्तमान में एक बग को ठीक कर रहा हूं जहां runOnUiThread का उपयोग करके UX को फ्लैश किया जाता है।
फोबाइमास्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.