2012-05-23 14 views
10

एंड्रॉयड में HandlerThread उपयोग करते हैं, हैंडलर/संभाल संदेश पोस्ट करने, अगर मैं एक HandlerThread का उपयोग नहीं करते (पारित अपने Looper हैंडलर के लिए), कि MainThread (यूआई धागा) का उपयोग इस मामले हैंडलर में मतलब है इस्तेमाल किया जा सकता लूपर?क्यों एंड्रॉयड

अगर हैंडलर MainThread के Looper का उपयोग करता है क्या परिणाम मिलेगा? मुख्य थ्रेड अवरुद्ध हो सकता है?

उत्तर

4

Doc के रूप में कहते हैं:

एक नया धागा एक looper है कि शुरू करने के लिए हैंडी वर्ग।
लूपर का उपयोग हैंडलर कक्षाएं बनाने के लिए किया जा सकता है।
ध्यान दें कि प्रारंभ() अभी भी कॉल किया जाना चाहिए।

HanderThread वर्ग थ्रेड वर्ग है, जो Looper वस्तु समाहित है, ताकि हम Looper खुला परवाह नहीं है और विवरण जारी से विरासत। सामान्य धागे के मामले में हमें और Looper.loop() का उपयोग LooperThread के रूप में परिवर्तित करने की आवश्यकता है। इस तरह HandlerThread उपयोग करने के लिए

4

सामान्य तरीका:

HandlerThread thread = new HandlerThread("A Handler Thread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
    //.... 
    } 
}; 

क्योंकि HandlerThread हैंडलर के लिए एक Looper बना सकते हैं, यह सुविधाजनक तरीका की तरह है।

जब आप एक नया हैंडलर बनाते हैं तो वह धागा है कि इसे बनाने के धागे/संदेश कतार के लिए बाध्य है - सरकारी दस्तावेज़ देख सकेंगे ...

+0

यह आधिकारिक डॉक्स है। एक नया धागा शुरू करने के लिए हैंडी क्लास जिसमें लूपर है। लूपर का उपयोग हैंडलर कक्षाएं बनाने के लिए किया जा सकता है। ध्यान दें कि प्रारंभ() अभी भी कॉल किया जाना चाहिए। 'मैंने आपका समय बचाया। – UnKnown

10

आप मामले में HandlerThread का प्रयोग करेंगे कि जो आप चाहते पृष्ठभूमि कार्यों को एक समय में और आप चाहते हैं कि वे कार्य निष्पादन के क्रम में चलेंगे।

उदाहरण के लिए यदि आप कई नेटवर्क पृष्ठभूमि संचालन एक-एक करके बनाना चाहते हैं।

हां, हैंडलर थ्रेड में इसका स्वयं का लूपर है और हैंडलर बनाया जा सकता है और इसे पोस्ट कर सकता है, (इसलिए यह मुख्य धागे को अवरुद्ध नहीं करेगा)।

0

हैंडलर थ्रेड उपयोगी है जब आप बहुत सारे पृष्ठभूमि कार्यों को निष्पादित करना चाहते हैं, क्योंकि इसका अपना लूपर है। आम तौर पर यदि आप एक हैंडलर को संदेश पोस्ट करते हैं तो यह मेन थ्रेड के लूपर का उपयोग करता है। इसका मतलब है कि कार्य यूआई थ्रेड पर निष्पादित किया गया है। लेकिन हैंडलर थ्रेड के मामले में, इन कार्यों को कार्यकर्ता धागे पर निष्पादित किया जाता है। आप एक अधिक विस्तृत विवरण here

2

अगर मैं एक HandlerThread (अपने Looper हैंडलर के पास) का उपयोग नहीं करते, कि इस मामले हैंडलर में मतलब है MainThread (यूआई धागा) का उपयोग के Looper मिल सकती है?

Handler

Handler() 

डिफ़ॉल्ट निर्माता सहयोगियों वर्तमान थ्रेड के लिए Looper के साथ इस हैंडलर के प्रलेखन पर एक नज़र डालें।

यदि आपका वर्तमान थ्रेड मेन थ्रेड है, तो यह मेन थ्रेड (यूआई थ्रेड) लूपर का उपयोग करता है।

स्पष्ट रूप से हैंडलर को अपने मेन थ्रेड (यूआई थ्रेड) में जोड़ने के लिए, नीचे कोड लिखें।

Handler mHandler = new Handler(Looper.getMainLooper(); 

आप लिखते हैं, जैसा कि नीचे है, तो यह HandlerThread Looper उपयोग करता है।

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 
Handler requestHandler = new Handler(handlerThread.getLooper()); 

आप Runnable कार्य में किसी भी नेटवर्क आईओ आपरेशन है, तो आप मुख्य धागा looper उपयोग नहीं कर सकते। उस स्थिति में, HandlerThreadRunnable कार्य करने के लिए काम कर रहा है नेटवर्क आईओ ऑपरेशन प्रदर्शन।

आप उदाहरण कोड @How do I fix android.os.NetworkOnMainThreadException?

अगर हैंडलर MainThread के Looper का उपयोग करता है क्या परिणाम मिल जाएगा मिल सकती है? मुख्य थ्रेड अवरुद्ध हो सकता है?

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

की जांच:

What is the purpose of Looper and how to use it?