2016-02-07 59 views
0

我正在使用RxAndroid,並且由於兩個可觀察對象我想執行改進請求。所以我用拉鍊操作使用RxJava進行改進時處理額外的可觀察性

Observable<RequestBuilder> obs = a.zipWith(b, (lhs, rhs) -> builder.b(rhs).a(lhs)); 

現在,這裏的問題是,builder.build()返回另一個觀察的ObservableRequest但這種方法現在使得ObservableObservableRequest我似乎無法弄清楚。我已經這樣做了,但我想這樣做是正確...

obs.map(
(builder) -> builder.build(api) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(this::setData) 
); 

也許類似

obs.map((builder) -> builder.build(api)) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(this::setData); 

回答

1

調試器,這可能會有幫助。

login方法RestPresenter

public void login(String email, String password) { 
     mRestService.getApi() 
       .postAuth(email, password, "") //create Observable 
       .timeout(TIMEOUT_IN_SECONDS, TimeUnit.SECONDS) //time out 
       .retry(RETRY_COUNT_FOR_REQUEST) //times to retry 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<AuthBean>() { // your model 
        @Override 
        public void onCompleted() { 
         // do nothing 
        } 

        @Override 
        public void onError(Throwable e) { 
         mView.showError("Error"); 
        } 

        @Override 
        public void onNext(AuthBean posts) { 
         mView.workWithLoginResponse(posts); 
        } 
       }); 
} 

調用它在你的activity

RestService mRestService = new RestService(); 
mRestPresenter = new RestPresenter(YourActivity.this, mRestService); 
mRestPresenter.login(email, password); 

RestService類可能看起來像這樣

public class RestService { 
    private ProviderApi mProviderApi; 
    private long CONNECTION_TIMEOUT_IN_SECONDS = 15L; 
    private long READ_TIMEOUT_IN_SECONDS  = 15L; 
    private long WRITE_TIMEOUT_IN_SECONDS  = 25L; 

    public RestService() { 
     RequestInterceptor requestInterceptor = new RequestInterceptor() { 
      @Override 
      public void intercept(RequestFacade request) { 
       request.addHeader("Accept", "application/json"); 
      } 
     }; 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(Config.URL_SERVER) 
       .setRequestInterceptor(requestInterceptor) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .setClient(new OkClient(getClient())) // need square/okhttp 
       .build(); 
     mProviderApi = restAdapter.create(ProviderApi.class); 
    } 

    private OkHttpClient getClient() { 
     OkHttpClient client = new OkHttpClient(); 
     client.setConnectTimeout(CONNECTION_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES); 
     client.setReadTimeout(READ_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES); 
     client.setWriteTimeout(WRITE_TIMEOUT_IN_SECONDS, TimeUnit.MINUTES); 
     return client; 
    } 

    public ProviderApi getApi() { 
     return mProviderApi; 
    } 
} 

mView是你activity,因此您只需創建workWithLoginResponse方法並按照服務器答案進行操作。

而且ProviderApi是接口和可能包含這樣的事:被返回

@FormUrlEncoded 
@POST("/auth") 
Observable<AuthBean> 
postAuth(@Field("login") String login, 
     @Field("password") String password); 
+0

感謝弗拉基米爾!但這是無關緊要的,我只是想知道如何將響應觀測值的可觀測量轉換爲響應觀測值。請看我的括號。 – JehandadK

+0

@DeBuGGeR,在您的代碼中指明您想要接收的Observable,並獲得它。您也可以將上面代碼中的'AuthBean'更改爲您自己的響應模型。 –

+0

我已經提到過它。 ObservableObservableRequest正在返回,但我想要返回ObservableRequest – JehandadK

0

ObservableObservableRequest但我想 ObservableRequest要返回

如何flatMap

//create Observable<Observable<Integer>> 
Observable.just(Observable.just(1, 2, 3)) 
     //convert to Observable<Integer> 
     .flatMap(integerObservable -> integerObservable) 
     //receive Integer values 
     .subscribe(integer -> { 
      //do something with Integer 
     }); 

More about flatMap