2017-12-02 20 views
0

私は複数のRetrofitリクエストを作成しており、リクエストごとに新しいトークンで新しいクライアントを生成する必要があります。問題は、クライアントがnullのように終了するのを待っていないということです。 generatePrivateToken()にもコールバックを追加しようとしましたが、うまくいきませんでした。Retrofit、RxJavaでコールバックを待つ方法

public void generatePrivateToken(){ 
     mNewControl.obstest(GETTOKEN) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Observer<Response<ResponseBody>>() { 
        @Override 
        public void onSubscribe(Disposable d) { 
        } 
        @Override 
        public void onNext(Response<ResponseBody> responseBodyResponse) { 
         key = responseBodyResponse.headers().get("Token"); 
         new ApiKeys().encryptToken(key, new GeneralCallback() { 
          @Override 
          public void onSuccess(String token) { 
           Log.e("Token", token); 
           client = new HttpClient(USERNAME,token, emptyTag, emptyTag).getClient(); 
          } 
         }); 
        } 
        @Override 
        public void onError(Throwable e) { 
        } 
        @Override 
        public void onComplete() { 

        } 
       }); 
    } 

public void getControlData(){ 
    generatePrivateToken(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(HOST_URL) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 
    newControl service = retrofit.create(newControl.class); 
    Call<List<GetControlData>> call = service.controlData(CONTROL); 
    call.enqueue(new Callback<List<GetControlData>>() { 
     @Override 
     public void onResponse(Call<List<GetControlData>> call, Response<List<GetControlData>> response) { 
      //do something, start new retrofit method 
     } 
     @Override 
     public void onFailure(Call<List<GetControlData>> call, Throwable t) { 
     } 
    }); 

} 

答えて

0

あなたの問題はよく知られており、Retrofitの通常のコールバックよりもrx Observableが必要な理由です。このanswerを参照してください。

あなたが最初に結合するために私達のレトロフィットオブジェクト

Retrofit repo = new Retrofit.Builder() 
     .baseUrl("https://api.github.com") 
     .addConverterFactory(GsonConverterFactory.create()) 
     .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
     .build(); 

Observable<JsonObject> userObservable = repo 
     .create(GitHubUser.class) 
     .getUser(loginName) 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()); 

Observable<JsonArray> eventsObservable = repo 
     .create(GitHubEvents.class) 
     .listEvents(loginName) 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()); 

簡単なPOJOを定義zip operator

レッツを使用することができ、あなたが終了した複数の改造要求を行うと、すべての要求を待つしたくないとしましょう

次に、RxJavaのzipメソッドを使用して2つのObservableを結合し、それらがcreの前に完了するのを待ちます新しいObservableを食べた。

Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, new Func2<JsonObject, JsonArray, UserAndEvents>() { 
    @Override 
    public UserAndEvents call(JsonObject jsonObject, JsonArray jsonElements) { 
    return new UserAndEvents(jsonObject, jsonElements); 
    } 
}); 

詳細については、上の回答をご覧ください。十分に説明してください。

関連する問題