解决rxjava导致的内存泄漏
2016-05-31 22:57
543 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。
1.使用取消订阅管理器:CompositeSubscription,让CompositeSubscription持有所有的请求。统一取消。
//这代码是mvp中使用的 public class LoginPresenter implements BasePresenter{ private UserLoginContract mView;//当前的页面 private CompositeSubscription msubscription;//管理所有的订阅 public LoginPresenter(UserLoginContract mView) { this.mView = mView; this.mView.setPresenter(this); this.msubscription = new CompositeSubscription(); } /** * 获取class */ public void getClassInfo() { HashMap<String, String> map = new HashMap<>(); map.put("id", "3"); Subscription i = ApiManger.getIntance().api.getClass(map) .flatMap(new Func1<BaseBean<List<SchoolClass>>, Observable<List<SchoolClass>>>() { @Override public Observable<List<SchoolClass>> call(BaseBean<List<SchoolClass>> listBaseBean) { return new ApiInterceptor().flatResult(listBaseBean); } }) .compose(RxSchedulers.<List<SchoolClass>>IO_Main()) .subscribe(new Subscriber<List<SchoolClass>>() { @Override public void onCompleted() { //获取数据完成 mView.loginSuccess(); } @Override public void onError(Throwable e) { ApiException apiException = (ApiException) e; mView.showToast(apiException.getRespMSg()); } @Override public void onNext(List<SchoolClass> schoolClasses) { //得到数据,在页面可以进行数据绑定操作 } }); this.msubscription.add(i);//把订阅加入管理集合中 } @Override public void onDestroy() { //在activity结束生命周期的时候取消订阅,解除对context的引用 if(msubscription != null){ this.msubscription.unsubscribe(); } } } public class BaseActivity extends AppCompatActivity { public BasePresenter presenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected void onDestroy() { super.onDestroy(); presenter.onDestroy(); } }
2.使用Rxlifecycle第三方库,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。组件生命周期结束时,自动取消对Observable订阅。
项目依赖:
//rxlifecycle 生命周期同步 compile 'com.trello:rxlifecycle:0.6.1' compile 'com.trello:rxlifecycle-components:0.6.1'
Rxlifecycle 使用
Activity/Fragment需继承RxAppCompatActivity/RxFragment,目前支持的有RxAppCompatActivity、RxFragment、RxDialogFragment、RxFragmentActivity。
一、bindToLifecycle()方法
在子类使用Observable中的compose操作符,调用,完成Observable发布的事件和当前的组件绑定,实现生命周期同步。从而实现当前组件生命周期结束时,自动取消对Observable订阅。
Observable.interval(1, TimeUnit.SECONDS) .compose(this.bindToLifecycle()) .subscribe(new Action1<Long>() { @Override public void call(Long num) { Log.i(TAG, " " +num); } });
二、bindUntilEvent() 方法
使用ActivityEvent类,其中的CREATE、START、 RESUME、PAUSE、STOP、 DESTROY分别对应生命周期内的方法。使用bindUntilEvent指定在哪个生命周期方法调用时取消订阅。Observable.interval(1, TimeUnit.SECONDS) .compose(this.bindUntilEvent(ActivityEvent.PAUSE)) .subscribe(mSub);
3.自己取消订阅:subscription.unsubscribe() ;
public abstract class BaseFragment extends Fragment { protected Subscription subscription; @Override public void onDestroyView() { super.onDestroyView(); unsubscribe(); } protected void unsubscribe() { if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } }
相关文章推荐
- 【java并发】多个线程间共享数据
- java简介
- 共同学习SpringMVC源码--DispatcherServlet(一)
- java中的 FileWriter类 和 FileReader类的一些基本用法
- Java基础01——下载、安装JDK及配置环境变量
- java:常用的两种设计模式(单例模式和工厂模式)
- Java定时发送邮件(一)
- Android Eclipse设置AS主题风格
- Java发送邮件服务
- java ClassLoader工作机制
- 正则表达式
- JAVA_SE异常捕获机制中的try-catch案例
- Maven创建所遇到的问题记录
- Spring事务配置的五种方式
- java 输入输出流练习题1
- Java高级之虚拟机加载机制
- Java高级之虚拟机加载机制
- 全面分析 Spring 的编程式事务管理及声明式事务管理
- javaWeb servlet生命周期
- Java EE开发平台随手记3——Mybatis扩展2