我正在查看用 MVP 编码的 Android 应用程序示例 ( link here )。但现在我想将教程中给定的 RxJava1 代码重新编码为 RxJava2 代码。但是,我遇到了麻烦,尤其是 unSubscribe()
和 isUnSubscribed()
。我尝试对其进行转换,我将分享我的尝试。
RxJava1代码:
public void doLogin(AuthCredentials credentials) {
cancelSubscription();
subscriber = new Subscriber<Account>() {
@Override public void onCompleted() {
if (isViewAttached()) {
getView().loginSuccessful();
}
}
@Override public void onError(Throwable e) {
if (isViewAttached()) {
getView().showError();
}
}
@Override public void onNext(Account account) {
eventBus.post(new LoginSuccessfulEvent(account));
}
};
// do login
accountManager.doLogin(credentials)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
private void cancelSubscription() {
if (subscriber != null && !subscriber.isUnsubscribed()) {
subscriber.unsubscribe();
}
}
这是我对 RxJava2 代码的尝试:
public void doLogin(AuthCredentials credentials) {
cancelSubscription();
subscriber = new Subscriber<Account>() {
@Override public void onSubscribe(Subscription s) {
// do login
accountManager.doLogin(credentials)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
@Override public void onCompleted() {
if (isViewAttached()) {
getView().loginSuccessful();
}
}
@Override public void onError(Throwable e) {
if (isViewAttached()) {
getView().showError();
}
}
@Override public void onNext(Account account) {
eventBus.post(new LoginSuccessfulEvent(account));
}
};
}
private void cancelSubscription() {
//isUnsubscribed and unsubscribe doesnt work anymore
}
我对 RxJava 的概念相当陌生。如果有人能指出我的错误并指导我,那就太好了。 :)
最佳答案
对于迟到的答复,我深表歉意。一直非常忙碌。正如 @akarnokd 所说,与 RxJava1 相比,RxJava2 进行了很多更改。有兴趣的请看这个video .
就上述问题而言,我们可以使用DisposableObservables
来实现同样的效果
以上问题的答案如下。我已经测试过了,它有效。
public void doLogin(AuthCredentials credentials) {
myDisposableObserver = new DisposableObserver<Account>() {
@Override
public void onNext(Account account) {
eventBus.post(new LoginSuccessfulEvent(account));
}
@Override
public void onError(Throwable e) {
if (isViewAttached()) {
getView().showError();
}
}
@Override
public void onComplete() {
if (isViewAttached()) {
getView().loginSuccessful();
}
}
};
// do login
accountManager.doLogin(credentials)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
}
private void cancelSubscriptionToMyPrescriptorManager() {
if (myDisposableObserver != null && !myDisposableObserver.isDisposed()) {
myDisposableObserver.dispose();
}
}
关于android - 从 RxJava1 迁移到 RxJava2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41510213/