[英]Network call with RXJava and Retrofit correct implementation - Android
我想对用户端点(注册一个新用户)进行简单的api调用,并在响应中获取auth令牌。 谁能解释这两个网络调用之间的区别?在我看来,哪种实现是正确的?
private void registerProcess(User user) {
mSubscriptions.add(Network.getRetrofit().getUserToken(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Response<TokenResponse>>() {
@Override
public void call(Response<TokenResponse> tokenResponse) {
if (tokenResponse.code() == 200) {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration success!");
} else {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration failed");
}
}
}));
}
private void registerProcess(User user) {
Network.getRetrofit().getUserToken(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<TokenResponse>>() {
@Override
public void onCompleted() {
/// what to do here???
}
@Override
public void onError(Throwable e) {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration failed");
}
@Override
public void onNext(Response<TokenResponse> tokenResponse) {
if (tokenResponse.code() == 200) {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration success!");
}
}
});
}
第一种情况:
onError
回调处理,因此,例如, IOException
将使您的应用程序崩溃。 第二:
onDestroy
回调中取消订阅,它将泄漏。 onNext
仅处理成功的响应,因此,如果HTTP代码不同于200,则不会发生任何事情。 正确的实现是这两个代码段的融合:
private void registerProcess(User user) {
mSubscriptions.add(Network.getRetrofit().getUserToken(user)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<TokenResponse>>() {
@Override
public void onCompleted() {
// you might do nothing here
}
@Override
public void onError(Throwable e) {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Error!");
}
@Override
public void onNext(Response<TokenResponse> tokenResponse) {
if (tokenResponse.code() == 200) {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration success!");
} else {
mProgressbar.setVisibility(View.GONE);
showSnackBarMessage("Registration failed");
}
}
});
}
当活动(或片段)被破坏时,请不要忘记调用mSubscriptions.clear()
来取消所有已存储订阅的订阅。
PS您可以利用doOnSubscribe
和doAfterTerminate
运算符来相应地设置初始和终端视图状态。 例如,避免多次调用mProgressbar.setVisibility(View.GONE)
:
mSubscriptions.add(Network.getRetrofit().getUserToken(user)
.doOnSubscribe(() -> mProgressbar.setVisibility(View.VISIBLE))
.doAfterterminate(() -> mProgressbar.setVisibility(View.GONE))
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.