2015-11-20 7 views
7

वहाँ वैसे भी observeOn समारोह में मौजूदा धागा उपयोग करने के लिए जावा rx बताने के लिए है? मैं एंड्रॉइड सिंकैडाप्टर के लिए कोड लिख रहा हूं और मैं चाहता हूं कि सिंक एडाप्टर थ्रेड में परिणाम मुख्य थ्रेड में न हों। मैंजावा आरएक्स में कॉलिंग थ्रेड पर कैसे निरीक्षण करें?

... 
.observeOn(AndroidSchedulers.handlerThread(new Handler(Looper.myLooper()))) 
... 

जो उसी तरह एंड्रॉयड rx मुख्य थ्रेड के लिए अनुसूचक बनाता है का उपयोग कर का उपयोग कर की कोशिश की

MyRetrofitApi.getInstance().getObjects() 
.subscribeOn(Schedulers.io()) 
.observeOn(<current_thread>) 
.subscribe(new Subscriber<Object>() { 
    //do stuff on the sync adapter thread 

} 

:

रेट्रोफिट + RX जावा के साथ एक उदाहरण नेटवर्क कॉल कि तरह दिखता है लेकिन अब जैसे ही मैं Looper.getMainLooper() के लिए स्थानापन्न के रूप में Looper.myLooper() काम नहीं करता।

मैं शेड्यूलर्स.न्यू थ्रेड() का उपयोग कर सकता हूं लेकिन बहुत से सर्वर कॉल के साथ इसके जटिल सिंकिंग कोड के रूप में मैं लगातार नए नेटवर्क कॉल को आग लगाने के लिए एक नया थ्रेड बनाउंगा जो फिर से अधिक नेटवर्क कॉल लॉन्च करने के लिए नए थ्रेड बनायेगा । क्या इसे करने का कोई तरीका है? या मेरा दृष्टिकोण पूरी तरह से गलत है?

+0

इसमें कुछ समय सट्टा उपयोग कर रहा है SyncAdapter के धागे पर सभी काम रखने के लिए ठीक है, तो मैं एक के रूप में इस पोस्टिंग नहीं कर रहा हूँ का जवाब: अब और 2.0 beta2 पर, रेट्रोफिट एक अलग धागे पर नेटवर्क अनुरोध नहीं करता है संस्करण से - यहाँ देखें: https://github.com/square/retrofit/commit/38ce2bee70342ac1ab08115d74802d3a54d85511 तो, आप के वर्तमान संस्करण उपयोग कर रहे हैं रीट्रोफिट आपको बस 'subscribeOn' और' observOn' को पूरी तरह से छोड़ने में सक्षम होना चाहिए और पूरे समय सिंक एडाप्टर थ्रेड पर रहना चाहिए। या मैंने आपके प्रश्न को गलत समझा है और आप नए धागे बनाना चाहते हैं, लेकिन उन्हें बस आपके द्वारा शुरू किए गए धागे पर वापस जाना चाहिए? –

उत्तर

1

ओह, मैं सिर्फ इस विकि में में पाया: https://github.com/ReactiveX/RxAndroid#observing-on-arbitrary-threads

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     final Handler handler = new Handler(); // bound to this thread 
     Observable.just("one", "two", "three", "four", "five") 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(HandlerScheduler.from(handler)) 
       .subscribe(/* an Observer */) 

     // perform work, ... 
    } 
}, "custom-thread-1").start(); 

मुझे लगता है कि यह भी अपने मामले के लिए काम करना चाहिए - एक नया थ्रेड के निर्माण को छोड़कर, बिल्कुल ... तो बस:

final Handler handler = new Handler(); // bound to this thread 
MyRetrofitApi.getInstance().getObjects() 
    .subscribeOn(Schedulers.io()) 
    .observeOn(HandlerScheduler.from(handler)) 
    .subscribe(new Subscriber<Object>() { 
     //do stuff on the sync adapter thread 

    } 
+0

त्वरित प्रतिनिधि के लिए धन्यवाद। मैंने आरएक्स एंड्रॉइड को अपग्रेड किया (मैंने एक पुराना संस्करण इस्तेमाल किया था) और उदाहरण की कोशिश की। दुर्भाग्य से यह काम नहीं किया, लेकिन मैंने कुछ परीक्षण किए और पता चला कि आगे अगला() कहा जाता है लेकिन सब्सक्राइबर इसे प्राप्त नहीं करता है। अंत में Looper.loop() जोड़ने के बाद ही यह काम प्रतीत होता है (जो एक infite पाश है जो संदेश को संसाधित करता है)। यहां तक ​​कि सटीक एक ही उदाहरण मुझे बताता है कि हैंडलर बनाने से पहले मुझे Looper.prepare() का उपयोग करने की आवश्यकता है। हो सकता है कि मैं कुछ मौलिक रूप से गलत कर रहा हूं या यह एंड्रॉइड आरएक्स के साथ एक समस्या हो सकती है? – tiqz

+0

मुझे डर है कि मैं आपको बता नहीं सकता कि क्या गलत यहाँ जा रहा है ... देखते हैं दूसरों को क्या कहना ... –

+0

'पता चला @tiqz डालते हैं हूँ onNext() कहा जाता है, लेकिन सब्सक्राइबर it' प्राप्त नहीं होता है onNext है कि एक सब्सक्राइबर की विधि तो जो आप लिखते हैं वह मेरे लिए थोड़ा अजीब है। सिद्धांत में डेविड का जवाब ठीक होना चाहिए। मैं आपको सलाह देता हूं कि आप जो भी कोशिश कर रहे हैं उसके बारे में अधिक विस्तृत सामग्री पोस्ट करें ताकि हम आपकी मदद कर सकें। – Diolor

3

Schedulers.immediate()

MyRetrofitApi.getInstance().getObjects() 
.subscribeOn(Schedulers.io()) 
.observeOn(Schedulers.immediate()) 
.subscribe(new Subscriber<Object>() { 
    //do stuff on the sync adapter thread 

} 

इसका वर्णन का उपयोग कर प्रयास का कहना है: Creates and returns a Scheduler that executes work immediately on the current thread.

नोट:
मुझे लगता है कि क्योंकि यह पहले से ही एक अलग धागा

+0

शेड्यूलर्स.मीडिएट() मेरे लिए काम नहीं कर रहा है। मुझे GlThread पर निरीक्षण करने की आवश्यकता है लेकिन यह subscribeOn से धागे पर देखते हैं। क्या कारण हो सकता है? –

+0

@DmitriyPuchkov अपने 'subscribeOn' और' observeOn' कार्यों का क्रम क्या है? –

+0

ऑर्डर वही है जैसा आप लिखते हैं। मैं कस्टम निष्पादक बनाने के द्वारा अपनी समस्या का समाधान करता हूं जो GLThread को रननेबल पोस्ट करता है। –

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