如何使用Retrofit,RxJava等待回调

时间:2017-12-02 13:24:06

标签: java android rx-android

我正在进行多次Retrofit请求,并且每次请求都需要使用新令牌生成新客户端。问题是它没有等待它完成所以客户端是null。我试图将回调添加到generatePrivateToken(),但它不起作用。

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

}

1 个答案:

答案 0 :(得分:0)

你的问题是众所周知的,这就是为什么我们需要rx Observable而不是Retrofit中的正常回调。请参阅此answer

我们假设你不想提出多个改装请求并等待所有请求都已完成,你可以使用zip operator

让我们首先定义我们的Retrofit对象

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组合两个对象:

public class UserAndEvents {
  public UserAndEvents(JsonObject user, JsonArray events) {
    this.events = events;
    this.user = user;
  }

  public JsonArray events;
  public JsonObject user;
}

然后使用RxJava的zip方法组合我们的两个Observable并在创建新的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);
  }
});

有关详细信息,请参阅上面给出的答案,这很好并完全解释。