2016-01-26 11 views
5

私はアンドロイドクライアントから私のWebサービスにアクセスするコードを書いています。私は様々なcalls.Atのための瞬間を観察可能なタイプを返すように改造を使用しています分で私は改装!一般的な観測可能なタイプを返します

@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ファクトリを使用します(下図参照)、これらの4を持っています。私は読んでいたブログ記事からこれを盗んだ。 。などのメソッド呼び出しの多く観察できるのI戻る私のインターフェイスで

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

にこれを変更しようとした同じように見え、改造はいないようですこれを好きにする。私はこれを回避する方法があるのだろうかと疑問に思っていたので、インターフェイスの呼び出しをもっと一般的なものにすることができます。例えば、自分のTypeAdapterをRestServiceFactoryに渡しますか?また、私は比較的新しく改造してrx-androidなので、どんなアドバイスも感謝しています。ありがとう!

答えて

1

フラットマップ機能を使用できます。私はアプリで同じことをしました。

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の選択クラスは、一般的なクラスです:あなたはRxSelectionオブジェクトにすべてのコールの結果を変換.ANDますされ、ここで

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

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

オブザーバーは、このように書きます1人のオブザーバーに任意のタイプの結果を伴うサービスの結果を観察することのみを要求する

関連する問題