gpt4 book ai didi

android - 使用 RxJava 和 Retrofit 2 登录成功后做一些事情

转载 作者:行者123 更新时间:2023-11-29 15:05:28 25 4
gpt4 key购买 nike

我实现了网络调用来验证登录,工作正常。登录成功后,我在再次调用以获取用户数据时遇到了一些麻烦。

这是 API 调用:

RestApi restApi = ServiceRest.createRetrofitService(RestApi.class, UrlServer.URL_SERVER);
Observable<Response<User>> responseObservable = restApi.getUser(user);
responseObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.unsubscribeOn(Schedulers.io())
.subscribe(new Subscriber<Response<User>>() {
@Override
public void onCompleted() {
Log.i("LoginActivity", "[onCompleted]");
progressDialog.dismiss();
}

@Override
public void onError(Throwable e) {
progressDialog.dismiss();
Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}

@Override
public void onNext(Response<User> userResponse) {
//Do stuff to go to another Activity
}
});


------------ 编辑 #1 --------------

我实现了@Tassos 的建议:

responseUser
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<Response<User>, Observable<Response<Object>>>() {
@Override
public Observable<Response<Object>> call(Response<User> userResponse) {
Log.d("USER", userResponse.body().getName());
return restApi.getData(userResponse.body().getToken());
}
})
.doOnError(new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
Toast.makeText(LoginActivity.this, "Error[doOnError]: " + throwable.toString(), Toast.LENGTH_SHORT).show();
}
})
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
Log.i("LoginActivity", "[onCompleted]");
}
@Override
public void onError(Throwable e) {
Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onNext(Object result) {
Log.d("RESPONSE", result.toString());
}
});

在订阅方法上这样做是否正确?我需要转换 onNext 的对象结果吗?

//---------------------------------------- ------------------------------//

我想在登录成功后,使用通过 Response 对象 User 获得的 token 调用另一个 url,并将其作为 Header 的授权发送给另一个 api 调用(Observable<Response<Object>> getData(@Header("Authorization") String token);)。我尝试过使用 flatMap 和 zip,但无法完成此任务。
有什么建议吗?这个概念对我来说是新的。

最佳答案

.flatMap 运算符是一个 API 调用然后另一个调用的完美方式。在这里阅读:http://blog.danlew.net/2014/09/22/grokking-rxjava-part-2/ “它变得更好”部分。

.flatMap 允许您将一个可观察对象更改为另一个可观察对象,即使用前一个对象的结果进行新的 API 调用,实现事件链。如果您这样做,订阅者将被调用以获得从 .flatMap 接收到的可观察值。

你只要写:

restApi.getUser(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(userResponse -> restApi.getData(userResponse.getToken()))
.doOnError(e -> Toast.makeText(LoginActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show())
.doOnTerminate(() -> progressDialog.dismiss())
.subscribe(response -> proceedWithLogin())

另外,您为什么要使用 .unsubscribeOn(Schedulers.io())?当您使用 retrofit observables 时,它们通常会生成一个事件,然后完成,并且不需要设置取消订阅调度程序。

关于android - 使用 RxJava 和 Retrofit 2 登录成功后做一些事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37887514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com