使用RxJava1.x這么久,對(duì) Subscription 應(yīng)該是很熟悉了虐唠,可以用來(lái)取消訂閱搀愧,當(dāng)然對(duì)于不熟悉的同學(xué),可以參考我的另一篇文章
RxJava1.x ------ 取消訂閱,Subscription
今天我們要講的是怎么解決 Observable持有Context導(dǎo)致的內(nèi)存泄露的問題疆偿。
首先咱筛,讓我們來(lái)認(rèn)識(shí)下 CompositeSubscription
在api中是這么介紹的:
/**
* Adds a new {@link Subscription} to this {@code CompositeSubscription} if the
* {@code CompositeSubscription} is not yet unsubscribed. If the {@code CompositeSubscription} <em>is</em>
* unsubscribed, {@code add} will indicate this by explicitly unsubscribing the new {@code Subscription} as
* well.
*
* @param s
* the {@link Subscription} to add
*/
public void add(final Subscription s) {
if (s.isUnsubscribed()) {
return;
}
if (!unsubscribed) {
synchronized (this) {
if (!unsubscribed) {
if (subscriptions == null) {
subscriptions = new HashSet<Subscription>(4);
}
subscriptions.add(s);
return;
}
}
}
// call after leaving the synchronized block so we're not holding a lock while executing this
s.unsubscribe();
}
簡(jiǎn)單的說就是 CompositeSubscription是一個(gè)可以裝很多Subscription 對(duì)象的集合,它和Subscription取消訂閱的方式極其相似杆故,也有判斷取消和取消訂閱的方法迅箩。
那么對(duì)于今天標(biāo)題的解答是什么呢,讓我們繼續(xù)往下看
問題的解決方案就是在生命周期的某個(gè)時(shí)刻取消訂閱反番。一個(gè)很常見的模式就是使用CompositeSubscription來(lái)持有所有的Subscriptions沙热,然后在onDestroy()或者onDestroyView()里取消所有的訂閱。
System.out.println(s)));
}
@Override
protected void onDestroy() {
super.onDestroy();
mCompositeSubscription.unsubscribe();
}
private CompositeSubscription mCompositeSubscription
= new CompositeSubscription();
private void doSomething() {
mCompositeSubscription.add(
AndroidObservable.bindActivity(this, Observable.just("Hello, World!"))
.subscribe(s -> System.out.println(s)));
}
@Override
protected void onDestroy() {
super.onDestroy();
mCompositeSubscription.unsubscribe();
}
你可以在Activity/Fragment的基類里創(chuàng)建一個(gè)CompositeSubscription對(duì)象罢缸,在子類中使用它篙贸。
注意! 一旦你調(diào)用了 CompositeSubscription.unsubscribe(),這個(gè)CompositeSubscription對(duì)象就不可用了, 如果你還想使用CompositeSubscription枫疆,就必須在創(chuàng)建一個(gè)新的對(duì)象了爵川。
ok,今天對(duì)于CompositeSubscription 的簡(jiǎn)單講解就到這里。謝謝額息楔。