简体   繁体   English

如何使用Retrofit,RxJava等待回调

[英]How to wait for callback with Retrofit, RxJava

I am making multiple Retrofit requests and with every request I need to generate new client with new token. 我正在发出多个Retrofit请求,对于每个请求,我都需要使用新令牌生成新客户端。 The problem is it is not waiting for it to finish so the client is null . 问题是它没有等待它完成,因此客户端为null I tried to add callback to generatePrivateToken() as well but it did not work. 我也尝试将回调添加到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) {
        }
    });

}

Your problem is well known and is why we need rx Observable over normal callback in Retrofit. 您的问题是众所周知的,这就是为什么在Retrofit中我们需要rx Observable而不是常规回调。 See this answer . 看到这个答案

Let's say you not want to make multiple retrofit requests and wait for all request have been finished, you can use the zip operator 假设您不想发出多个改造请求并等待所有请求完成,则可以使用zip运算符

Let's first define our Retrofit object 让我们首先定义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());

simple POJO to combine the two objects: 简单的POJO组合两个对象:

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

  public JsonArray events;
  public JsonObject user;
}

then use RxJava's zip method to combine our two Observables and wait for them to complete before creating a new Observable. 然后使用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);
  }
});

For more details, visit the answer a give above, it's nice and fully explain. 有关更多详细信息,请访问上面的给出的答案,它很好并进行了充分说明。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM