我正在进行多次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) {
}
});
}
答案 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);
}
});
有关详细信息,请参阅上面给出的答案,这很好并完全解释。