2016-01-26 8 views
5

Jestem w trakcie pisania kodu, aby uzyskać dostęp do mojej usługi Webservice z mojego klienta Android. Na minutę używam modernizację wrócić typ obserwowalne dla różnych calls.At moment mam 4 z nich (pokazane poniżej)Modernizacja! zwracając ogólny typ obserwowalny

@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); 

Używam również rodzajowe fabryki RestService stworzyć ogólną usługę modernizacji. Ukradłem to z bloga, który czytałem :) .

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; 
} 

W moim interfejsu gdzie Powrót zauważalny etc dużo połączeń metodą wyglądają tak samo, więc próbowałem zmieniając to do następnego generycznego połączenia

Observable<List<T>> 

Niestety, modernizacja nie wydaje polubić to. Zastanawiam się, czy jest jakiś sposób obejścia tego problemu, dzięki czemu mogę wywoływać interfejsy jeszcze bardziej ogólne, na przykład przekazywanie mojego TypeAdapter do RestServiceFactory? Ponadto, jestem stosunkowo nowy w modernizacji i rx-androidie, więc wszelkie rady są mile widziane. Dzięki!

Odpowiedz

1

możesz użyć funkcji flatMap. Zrobiłem to samo w mojej aplikacji.

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); 

Rx klasa wybór to ogólna klasa:

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; 
    } 
} 

Obserwator idzie tak:

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; 
} 

tutaj konwertowania wynik wszystkich połączeń do obiektu RxSelection .i Ciebie wymaga tylko 1 obserwatora do obserwowania wyniku jakiejkolwiek usługi z dowolnym rodzajem wyniku.