gpt4 book ai didi

java - 如何在不启动新进程的情况下再次订阅 Observable?

转载 作者:太空狗 更新时间:2023-10-29 13:16:16 27 4
gpt4 key购买 nike

我有 Observable

Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
if (subscriber.isUnsubscribed()) {
return;
}

for (int i = 0; i < 100; i++) {
Thread.sleep(100);
subscriber.onNext("Loading:"+i);
}
subscriber.onCompleted();
}
});

订阅者

 Subscriber<? super String> sub = new Subscriber<String>() {
@Override
public void onCompleted() {
pDialog.setMessage("Successfully Done!");
pDialog.cancel();
}

@Override
public void onError(Throwable e) {
pDialog.cancel();
}

@Override
public void onNext(String string) {
pDialog.setMessage(string);
}
};

点击按钮后我这样做:

  compositeSubscription.add(observable.subscribeOn(Schedulers.newThread()).observeOn(
AndroidSchedulers.mainThread()).subscribe(sub));

在 Activity 中:

@Override
protected void onStart() {
super.onStart();
compositeSubscription = new CompositeSubscription();
}

@Override
protected void onStop() {
if (!compositeSubscription.isUnsubscribed()&&compositeSubscription.hasSubscriptions())
compositeSubscription.unsubscribe();
super.onStop();
}

单击按钮后,会显示对话框并更新消息。

但是如果我最小化应用程序并再次打开它,订阅会丢失并且消息不会更新,但进程会继续执行。

如何在不启动新进程的情况下再次订阅 Observable?

最佳答案

1) 您在这里处理的是一个冷可观察对象,这意味着每次订阅都会调用OnSubscribe.call()。您可以在此处使用 publish()Observable 转换为 ConnectableObservable 或将 cold 转换为 的任何其他运算符热

2) 如果您希望您的 Observable 在从后台返回后继续工作,可能 onStart/onStop 不是正确的生命周期回调。我会去 onCreate/onDestroy 那里

3) 取消订阅不会停止 OnSubscribe.call() 的执行。最简单的解决方案是检查循环内的 isUn​​subscribed() 并相应地停止。

关于java - 如何在不启动新进程的情况下再次订阅 Observable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415952/

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