Android Retrofit生命周期的管理
Retrofit应该是目前Android上最流行的网络框架之一了。那么怎么管理他的生命周期呢,总不能在每个引用的Activity或Fragment生命周期中都去手动cancel网络请求吧。接下来介绍几种实用的方法。
1.借助rxjava,CompositeSubscription类。
CompositeSubscription是Subscriptions的集合类,用于取消订阅操作。可集成在BaseActivity/BaseFragment用于统一管理。
首先将接口封装为Observable,用于添加进compositeSubscription
@GET(Config.CITYS)
Observable<HttpDataListResponseBean<CityEntity>> citys();
其次在BaseActivity/BaseFragment统一管理composieSubcription
public abstract class BaseActivity extends Activity{
private CompositeSubscription mCompositeSubscription;
public CompositeSubscription getCompositeSubscription() {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
return this.mCompositeSubscription;
}
public void addSubscription(Subscription s) {
if (this.mCompositeSubscription == null) {
this.mCompositeSubscription = new CompositeSubscription();
}
this.mCompositeSubscription.add(s);
}
@Override
public void onDestroy() {
super.onDestroy();
//在销毁时统一取消
if (this.mCompositeSubscription != null) {
this.mCompositeSubscription.unsubscribe();
}
}
}
这样只要在请求的时候调用addSubscription()方法即可。
2.还是借助强大的rxjava。利用rxlifecycle框架管理生命周期。
首先添加引用
compile 'com.trello:rxlifecycle-components:0.6.1'
让你的activity继承RxActivity,RxAppCompatActivity,RxFragmentActivity
让你的fragment继承RxFragment,RxDialogFragment
RetrofitClient.getInstance().get().citys()
.subscribeOn( Schedulers.io())
.compose(this.<Long>bindToLifecycle()) //这个订阅关系跟Activity绑定,Observable 和activity生命周期同步
.observeOn( AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println("lifecycle--" + aLong);
}
});
}
当Activity结束掉以后,Observable停止发送数据,订阅关系解除。
这里bindToLifecycle默认是对应Activity的onDestroy事件的,我们也可以换成 bindUntilEvent()对应其他生命周期。
bindUntilEvent( ActivityEvent event),这里ActivityEvent是枚举类,包含activity全部生命周期
public enum ActivityEvent {
CREATE,
START,
RESUME,
PAUSE,
STOP,
DESTROY
}
如果是Fragment里面调用,则可以将ActivityEvent换为FragmentEvent,用法一样
3.利用RetrofitLifecycle
如果不想借助Rxjava,那可以使用网上的开源框架RetrofitLifecycle
https://github.com/luckyandyzhang/RetrofitLifecycle