2015-10-31 7 views
8

अपने Android एप्लिकेशन में RxJava साथ Retrofit उपयोग करते हैं, और मेरे कोड:रेट्रोफिट डिफ़ॉल्ट धागा

public void getConfig(NetworkSubscriber subscriber) { 
    Observable<Config> observable = mApi.getConfig(); 
    observable.subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(subscriber); 
} 

public void getCode(String mobile, int type, NetworkSubscriber subscriber) { 
    Observable<BaseMessageEntity> observable = mApi.getCode(mobile, type); 
    observable.subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(subscriber); 
} 

और मुझे .subscribeOn(Schedulers.newThread()) लिखने के लिए नहीं करना चाहते हैं और .observeOn(AndroidSchedulers.mainThread()) हर व्यवसाय विधि

मैं कैसे कर सकते हैं ?

उत्तर

17

यदि आप प्रत्येक कॉल पर इच्छित थ्रेड निर्दिष्ट नहीं करना चाहते हैं, तो आप अपने थ्रेड को डिफ़ॉल्ट रूप से सेट करने के लिए RxJavaCallAdapterFactory के आसपास एक रैपर बना सकते हैं।

public class RxThreadCallAdapter extends CallAdapter.Factory { 

    RxJavaCallAdapterFactory rxFactory = RxJavaCallAdapterFactory.create(); 
    private Scheduler subscribeScheduler; 
    private Scheduler observerScheduler; 

    public RxThreadCallAdapter(Scheduler subscribeScheduler, Scheduler observerScheduler) { 
     this.subscribeScheduler = subscribeScheduler; 
     this.observerScheduler = observerScheduler; 
    } 

    @Override 
    public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { 
     CallAdapter<Observable<?>> callAdapter = (CallAdapter<Observable<?>>) rxFactory.get(returnType, annotations, retrofit); 
     return callAdapter != null ? new ThreadCallAdapter(callAdapter) : null; 
    } 

    final class ThreadCallAdapter implements CallAdapter<Observable<?>> { 
     CallAdapter<Observable<?>> delegateAdapter; 

     ThreadCallAdapter(CallAdapter<Observable<?>> delegateAdapter) { 
      this.delegateAdapter = delegateAdapter; 
     } 

     @Override public Type responseType() { 
      return delegateAdapter.responseType(); 
     } 

     @Override 
     public <T> Observable<?> adapt(Call<T> call) { 
      return delegateAdapter.adapt(call).subscribeOn(subscribeScheduler) 
       .observeOn(observerScheduler); 
     } 
    } 
} 

और फिर अपने निर्माता के अंतर्गत RxJavaCallAdapterFactory.create() के बजाय इसका इस्तेमाल -

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("https://api.github.com/") 
    .addConverterFactory(GsonConverterFactory.create()) 
    .addCallAdapterFactory(new RxThreadCallAdapter(Schedulers.io(), AndroidSchedulers.mainThread())) 
    .build(); 
+0

ब्रो सोचता है! आप समझ गए! – xuyanjun

+0

यदि आप थ्रेड (आईई कस्टम एक्सेस मैनेजमेंट) '' 'रिटर्न प्रतिनिधि एडेप्टर.responseType() पर कॉल करते हैं, तो यह त्रुटियां शून्य सूचक लौटाएंगी। –

6

आप इसे compose() का उपयोग करके एक पंक्ति में कम कर सकते हैं। उदाहरण के लिए, नीचे आपके getConfig() विधि का एक संशोधित संस्करण है। यह मानता है कि आप रेट्रोलंबडा का उपयोग कर रहे हैं।

public void getConfig(NetworkSubscriber subscriber) { 
    Observable<Config> observable = mApi.getConfig(); 
    observable 
      .compose(this::setupThreads) 
      .subscribe(subscriber); 
} 

setupThreads() विधि इस प्रकार दिखाई देगा:

private <T> Observable<T> setupThreads(final Observable<T> observable) { 
    return observable 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()); 
} 

कुछ संदर्भ:

+0

धन्यवाद, मुझे मिल गया। लेकिन, आरएक्स स्वयं द्वारा इसे हल करने का कोई तरीका नहीं है? – xuyanjun

+0

@xuyanjun - 'compose() 'RxJava का एक महत्वपूर्ण हिस्सा है, इसलिए मुझे पूरा यकीन नहीं है कि" आरएक्स स्वयं द्वारा इसे हल करें "का क्या मतलब है। इस मामले में 'लिखें()' आपको '.subscribeOn (Schedulers.newThread()) को जोड़ने के बिना 'setupThreads()' को ओवर-ओवर का उपयोग करने की अनुमति देगा। देखें (AndroidSchedulers.mainThread()) 'प्रत्येक पर्यवेक्षण योग्य । – kjones

6

subscribeOn के लिए एक डिफ़ॉल्ट अनुसूचक है करने के लिए आप जब अपने Retrofit उदाहरण बनाकर सीधे RxJavaCallAdapterFactory लिए एक तर्क के रूप में यह पारित कर सकते हैं:

new Retrofit.Builder() 
      .client(okHttpClient) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
      .build(); 

रेट्रोफिट में पेश किया गया 2.0.0