RxJava

2015-08-05 15 views
8

में धागे की सुरक्षा के लिए आवश्यक है SerializedSubject मैं RxJava में एक Subject उदाहरण बनाया और एक से अधिक थ्रेड से अपने onNext() फोन:RxJava

PublishSubject<String> subject = PublishSubject.create(); 
//... 
subject.onNext("A"); //thread A 
subject.onNext("B"); //thread B 

RxJava documentation का कहना है कि:

देखभाल नहीं कॉल करने के लिए इसके onNext( ) विधि (या अन्य तरीकों पर) कई धागे से, क्योंकि यह गैर-धारावाहिक कॉल का कारण बन सकता है, जो पर्यवेक्षण अनुबंध का उल्लंघन करता है और परिणामी Subject में अस्पष्टता पैदा करता है।

  • मैं यह सोचते हैं मुझे परवाह नहीं "A" से पहले या "B" के बाद हो जाता है तो इस तरह के हैं Subject पर toSerialized() कॉल करने के लिए है? क्रमिकरण कैसे मदद करेगा?
  • Subject थ्रेड-सुरक्षित है या फिर मैं toSerialized() के बिना RxJava तोड़ दूंगा?
  • "अवलोकन योग्य अनुबंध" क्या दस्तावेज का उल्लेख है?

उत्तर

7

मैं यह सोचते हैं मुझे परवाह नहीं है अगर 'ए' से पहले या 'बी' के बाद चला जाता है इस तरह के विषय पर toSerialized() कॉल करने के लिए है?

हाँ toSerialized() का उपयोग करें क्योंकि इस विषय पर लागू सभी ऑपरेटर मानते हैं कि उचित धारावाहिक अपस्ट्रीम हो रहा है। यदि ऐसा नहीं होता है तो स्ट्रीम अप्रत्याशित परिणाम विफल हो सकती है या उत्पन्न हो सकती है।

क्या विषय थ्रेड-सुरक्षित है या क्या मैं RxJava को बिना serialized() के बिना तोड़ दूंगा?

"प्रत्यक्ष अनुबंध" कि प्रलेखन का उल्लेख है क्या है ऊपर दिए?

Rx Design Guidelines.pdf सेक्शन 4 पर्यवेक्षण अनुबंध को परिभाषित करता है। मुझे लगता है कि आरएक्सजेवा दस्तावेज इसे और अधिक खोजने योग्य बनाना चाहिए ताकि मैं एक मुद्दा उठाऊंगा।

2
डेव के जवाब के अनुसार

, यदि आप जानते पहले से है कि अपने विषय अलग धागे से पहुँचा जा रहा है, आप इसे एक SerializedSubject http://reactivex.io/RxJava/javadoc/rx/subjects/SerializedSubject.html

Wraps में एक विषय लपेट सकता है इतना है कि यह सुरक्षित है विभिन्न धागे से तरीकों पर अपने विभिन्न कॉल करने के लिए।

की तरह: private final Subject<Object, Object> bus = new SerializedSubject<Object, Object>(PublishSubject.create());

(बेन क्रिस्टेनसेन के EventBus उदाहरण यहां से ली गई है: http://bl.ocks.org/benjchristensen/04eef9ca0851f3a5d7bf)

+4

है कि क्या .toSerialized() है ... –

+0

जब स्रोत कोड को देखो: 'सार्वजनिक अंतिम SerializedSubject toSerialized() { अगर (getClass() == SerializedSubject.class) { वापसी (SerializedSubject ) इस; } नया सीरियलाइज्ड सब्जेक्ट (यह) लौटाएं; } ' सेरियलाइज्ड() का उपयोग करने के बजाय नया एक सीरियलाइज्डब्जेक्ट स्मृति में अनावश्यक नए उदाहरण बनाने से रोक देगा, इसलिए यह उत्तर अभी भी बेहतर है। – superuser