Retrofit observable 只工作一次
Retrofit observable works only once
我知道,默认情况下,改造创建的可观察对象是 "cold" 可观察对象。
我对我的服务器端点有这个特定的调用
@POST("oauth/token")
Observable<Token> signIn(@Field("username") String username, @Field("password") String password);
当我这样做时:
public class LoginUseCase extends Subscriber<Profile> {
public void logIn(String username, String password) {
Subscription subscription = myApi.signIn(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this);
this.add(subscription);
}
}
我收到了 onNext
onError
onComplete
回调,如您所料。
登录失败出现问题,我重试了。第二次调用 login()
方法不会触发 http 调用,我也没有收到任何回调。
顺便说一下,我正在用我的 onComplete()
方法
@Override
public void onCompleted() {
this.unsubscribe();
}
每次我调用 myApi.signin()
时,有没有办法告诉 retrofit/rxandroid 重新进行 http 调用。我的处理方式是否正确?
备注:
- 我在我的项目中使用 dagger2 并且 myApi 对象是一个单例。
- 即使我在第一次和第二次尝试
之间使用不同的 username/pass 配置,我也能够重现错误
一旦调用 Subscriber#unsubscribe()
,订阅者将永远无法接收新值。每次你想订阅一个新的可观察对象时,你都需要重新创建你的订阅者。
发生的事情是,在对 Subscriber#add(Subscription)
的调用中,它看到订阅者已经取消订阅并立即取消新订阅。
我知道,默认情况下,改造创建的可观察对象是 "cold" 可观察对象。
我对我的服务器端点有这个特定的调用
@POST("oauth/token")
Observable<Token> signIn(@Field("username") String username, @Field("password") String password);
当我这样做时:
public class LoginUseCase extends Subscriber<Profile> {
public void logIn(String username, String password) {
Subscription subscription = myApi.signIn(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this);
this.add(subscription);
}
}
我收到了 onNext
onError
onComplete
回调,如您所料。
登录失败出现问题,我重试了。第二次调用 login()
方法不会触发 http 调用,我也没有收到任何回调。
顺便说一下,我正在用我的 onComplete()
方法
@Override
public void onCompleted() {
this.unsubscribe();
}
每次我调用 myApi.signin()
时,有没有办法告诉 retrofit/rxandroid 重新进行 http 调用。我的处理方式是否正确?
备注: - 我在我的项目中使用 dagger2 并且 myApi 对象是一个单例。 - 即使我在第一次和第二次尝试
之间使用不同的 username/pass 配置,我也能够重现错误一旦调用 Subscriber#unsubscribe()
,订阅者将永远无法接收新值。每次你想订阅一个新的可观察对象时,你都需要重新创建你的订阅者。
发生的事情是,在对 Subscriber#add(Subscription)
的调用中,它看到订阅者已经取消订阅并立即取消新订阅。