我的问题可能与How to use CompositeDisposable of RxJava 2?重复,但要求澄清一个疑问。 根据接受的答案
// Using clear will clear all, but can accept new disposable
disposables.clear();
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose();
在我的情况下,我使用片段作为我的视图(在MVP中查看图层),在某些情况下,我将活动片段添加到backstack,实际上不会杀死Fragment但只会查看其视图。这意味着只调用onDestroyView
而不是onDestroy
。后来我可以回到Backstack中的同一个片段,所以只有它的视图才被重新创建。
我有CompositeDisposable
作为我BaseFragment
的成员,其中包含订阅。
我的问题是,我应该每次clear
致电CompositeDisposable
onDestroyView
吗?一旦视图恢复,它可以再次获取订阅吗?并在dispose
上调用onDestroy
,这样当片段本身被销毁时,不再需要丢弃一次性用品了吗?
如果错了,处理的正确方法是什么。必须调用clear
和dispose
时。?
答案 0 :(得分:6)
您是对的,每次创建相应的视图时,您都可以避免创建新的CompositeDisposable
,而是将CompositeDisposable
视为与{{{{}}绑定的单个实例。 1}}生命周期方法并将聚合的一次性用法视为onCreate/onDestroy
中调用clear
的片段视图的一部分。
答案 1 :(得分:4)
代替使用Composite Disposable.dispose()
,您可以更好地使用CompositeDisposable.clear()
,这样就不必创建新的CompositeDisposable:method documentation。
clear() //Atomically clears the container, then disposes all the previously contained Disposables.
dispose() //Dispose the resource, the operation should be idempotent.
答案 2 :(得分:0)
private final CompositeDisposable disposables = new CompositeDisposable();
// adding an Observable to the disposable
disposables.add(sampleObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableObserver<String>() {
@Override
public void onComplete() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String value) {
}
}));
static Observable<String> sampleObservable() {
return Observable.defer(new Callable<ObservableSource<? extends String>>() {
@Override
public ObservableSource<? extends String> call() throws Exception {
// Do some long running operation
SystemClock.sleep(2000);
return Observable.just("one", "two", "three", "four", "five");
}
});
}
// Using clear will clear all, but can accept new disposable
disposables.clear();
// Using dispose will clear all and set isDisposed = true, so it will not accept any new disposable
disposables.dispose();
我创建了一个示例项目来演示RxJava2的用法。在这里您可以找到sample project - RxJava2-Android-Samples
答案 3 :(得分:-1)
def tsplot2(y, title, lags=None, figsize=(12,8)):
if not isinstance(y, pd.Series):
y = pd.Series(y)
fig= plt.figure(figsize=figsize)
layout=(2,2)
ts_ax=plt.subplot2grid(layout, (0,0))
hist_ax=plt.subplot2grid(layout, (0,1))
acf_ax=plt.subplot2grid(layout, (1,0))
pacf_ax=plt.subplot2grid(layout, (1,1))
y.plot(ax=ts_ax)
ts_ax.set_title(title, fontsize=14, fontweight='bold')
y.plot(ax=hist_ax, kind='hist', bins=25)
hist_ax.set_title('Histogram')
smt.graphics.plot_acf(y, lags=lags, ax=acf_ax)
smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax)
sns.despine()
plt.tight_layout()
return ts_ax, acf_ax, pacf_ax
num_var= len(series.iloc[1,:])
for i in range(0, num_var):
tsplot2(series.iloc[:,i].dropna() , title=series.columns[i], lags=48)
是一个好方法。您可以在clear
和CompositeDisposable
之间共享一个Activity
。这样,您的Fragments
可以暂停清除,而不必管理每个Activity
中的任务,并且Fragment
开始将resume
重新添加回subscriptions
中。有几种共享方式。就我而言,我喜欢使用CompositeDisposable
。