2013-05-17 8 views
11

का उपयोग करके थ्रेडिंग ईवेंट मैंने अभी एंड्रॉइड के लिए ग्रीनरोबोट के EventBus को देखना शुरू कर दिया है और थ्रेडिंग के बारे में कोई प्रश्न है।ग्रीनरोबोट इवेंटबस

मेरे पास एक लंबी चल रही प्रक्रिया है जिसे मैं पृष्ठभूमि थ्रेड पर चलाना चाहता हूं, जो पूरा होने पर, यूआई अपडेट करता है।

तो जैसे कुछ:

public void onEventBackgroundThread(MyEvent event) { 
     doSomeLongRunningProcess(); 
     updateUI(); 
    } 

जाहिर updateUI() यहाँ नहीं कहा जा सकता, क्योंकि यह भी पृष्ठभूमि में चलाने होगा।

तो इसे संभालने का अनुशंसित तरीका क्या होगा? मेरे onEventBackgroundThread() के भीतर से एक और घटना फायर करें जो यूआई थ्रेड पर चलेगा? या इसे लंबे समय से चलने वाली प्रक्रिया से ही आग लगाना? या क्या एक बेहतर पैटर्न है?

उत्तर

21

परिणाम मिलने पर मैं शायद एक और घटना को आग लगा दूंगा।

public void onEventBackgroundThread(MyEvent event) { 
    doSomeLongRunningProcess(); 
    EventBus.getDefault().post(new MyEventResult()); 
} 

हालांकि जागरूक रहें: reading the docs, तो आप इस लगता है:

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

यदि आप इस विधि में काफी समय लेते हैं, तो अन्य इवेंटबस कॉलबैक में देरी होगी जो शायद एक उत्तरदायी आवेदन में अनुवाद करेगी।

आप शायद onEventAsync उपयोग करना चाहते हैं:

Async: इवेंट हैंडलर तरीकों एक अलग थ्रेड में कहा जाता है। यह पोस्टिंग थ्रेड और मुख्य धागे से हमेशा स्वतंत्र है। पोस्टिंग ईवेंट इस मोड का उपयोग करके ईवेंट हैंडलर विधियों के लिए कभी भी प्रतीक्षा नहीं करते हैं। इवेंट हैंडलर विधियों को इस मोड का उपयोग करना चाहिए यदि उनके निष्पादन कुछ समय ले सकता है, उदा। नेटवर्क के उपयोग के लिए। समवर्ती धागे की संख्या को सीमित करने के लिए पर एक लंबे समय तक चलने वाले असीमित हैंडलर विधियों की संख्या को ट्रिगर करने से बचें। इवेंटबस एक थ्रेड पूल का उपयोग करता है ताकि पूर्ण एसिंक्रोनस इवेंट हैंडलर नोटिफिकेशन से थ्रेड का कुशलतापूर्वक उपयोग किया जा सके।

+0

धन्यवाद, पेड्रो। और EventAsync पर आपकी सिफारिश की सराहना करते हैं। – jFort

3

मैं एक और घटना फायरिंग का सुझाव दूंगा जो onEventMainThread विधि द्वारा संभाला जाएगा।

इसका updateUI का सकारात्मक प्रभाव पड़ता है यदि रिसीवर पहले से ही पंजीकरण नहीं किया गया है (उदा। गतिविधि को अनियंत्रित किया गया क्योंकि यह नष्ट हो गया था)।

संबंधित मुद्दे