2016-01-26 21 views
5

लौट रहा हूं मैं अपने एंड्रॉइड क्लाइंट से अपनी वेबसाइट सेवा तक पहुंचने के लिए कोड लिखने की प्रक्रिया में हूं। मिनट मैं पुराना वापस उपयोग कर रहा हूँ विभिन्न calls.At के लिए पल एक नमूदार प्रकार वापस जाने के लिए पर मैं इनमें से 4 (नीचे दिखाया गया)रेट्रोफिट! एक सामान्य अवलोकन योग्य प्रकार

@FormUrlEncoded 
@POST("/app/{pathto}") 
Observable<List<EntryItem>> getNewsAndComments(@Path("pathto") String pathto, @FieldMap Map<String, String> fieldnames); 


/** 
* adding a comment. returns observable 
* with message entity type 
* 
* @param pathto 
* @param fieldnames 
* @return 
*/ 

@FormUrlEncoded 
@POST("/app/{pathto}") 
Observable<message> postComment(@Path("pathto") String pathto, @FieldMap Map<String, String> fieldnames); 


@FormUrlEncoded 
@POST("/{pathto}") 
Call<message> regDevice(@Path("pathto") String pathto ,@FieldMap Map<String, String> fieldnames); 

/** 
* return a Map of canteen menu items! 
* 
* @param path 
* @param fielditems 
* @return 
*/ 

@FormUrlEncoded 
@POST("/app/{pathto}") 
Observable<Map<String, ArrayList<CantItem>>> getCanteenItems(@Path("path") String path, @FieldMap Map<String,String> fielditems); 

मैं भी सामान्य पुराना वापस सेवा बनाने के लिए एक सामान्य RestService कारखाने का उपयोग करें। मैंने इसे एक ब्लॉग पोस्ट से चुरा लिया जिसे मैं पढ़ रहा था :) ।

public static <T> T getRetroFitService(final Class<T> clazz, final String endpoint) 
{ 

    final Retrofit retrofit = new Retrofit.Builder() 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .baseUrl(endpoint) 
      .build(); 

    T service = retrofit.create(clazz); 
    return service; 
} 

मेरी इंटरफ़ेस में जहां मैं एक नमूदार की वापसी आदि विधि कॉल का एक बहुत ही दिखाई तो मैं निम्नलिखित सामान्य कॉल

Observable<List<T>> 

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

उत्तर

1

आप flatMap फ़ंक्शन का उपयोग कर सकते हैं। मैंने अपने ऐप में भी ऐसा ही किया।

OrderController.getOrderInterface() 
        .resendEventSMS(Common.getUserToken(this),order_id) 
        .subscribeOn(Schedulers.io()) 
        .flatMap(result ->Observable.just(new RxSelection(RESEND_SMS,result))) 
        .onErrorReturn(throwable ->new RxSelection(RESEND_SMS_ERROR,getError(throwable))) 
        .observeOn(AndroidSchedulers.mainThread()); 
      .subscribe(mOrderObserver); 

आरएक्स चयन वर्ग एक सामान्य वर्ग है:

public class RxSelection { 

    private int what; 
    private Object obj; 

    public RxSelection(int what, Object obj){ 
     this.obj=obj; 
     this.what=what; 
    } 
    public int getWhat(){ 
     return what; 
    } 
    public Object getObj(){ 
     return obj; 
    } 
} 

ऑब्जर्वर इस प्रकार है:

mOrderObserver = new Observer<RxSelection>() { 
      @Override 
      public void onSubscribe(Disposable d) { 
       Common.log(EventOrderDetailActivity.this,TAG, "subscribe"); 
      mDisposableList.add(d); 
     } 

     @Override 
     public void onNext(RxSelection value) { 
      Common.log(EventOrderDetailActivity.this,TAG, "OnNext"); 
      switch (value.getWhat()) { 
       case GET_EVENT_ORDER_DETAILS: 
        mEventOrderDetail= (EventOrderDetail) value.getObj(); 
        setupData(); 
        break; 

       case RESEND_SMS: 
        HashMap<String,String> sms= (HashMap<String,String>) value.getObj(); 
        Toast.makeText(EventOrderDetailActivity.this, sms.get("success"), Toast.LENGTH_SHORT).show(); 
        break; 
} 
यहाँ

आप RxSelection वस्तु .और आप सभी कॉल का परिणाम परिवर्तित कर रहे हैं किसी भी प्रकार के परिणाम

के साथ किसी भी सेवा के पर्यवेक्षक परिणाम के लिए केवल 1 पर्यवेक्षक की आवश्यकता होती है
संबंधित मुद्दे