RxJava2 如何使工作线程在Disposable.dispose后完成流程
2018-03-07 19:20
162 查看
在使用Rxjava2时,特别要注意内存泄漏。所以一般在activity或者fragment销毁时调用disposable.dispose来取消订阅。但在之前的工作中遇到一个问题,如何确保你在work thread中的流程走完。用过的同学会知道dispose会产生Exception导致线程中断。
一种方式就是不在activity或者fragment销毁时调用disposable.dispose,在工作线程完成后再说。这样本人感觉并不好,因为我们一般在Consumer里对UI线程做更新,如:
new Consumer<Long>() { @Override public void accept(Long data) { textView.setText("get data : " + data); } };activity销毁时其实已经没有必要再更新UI,而且如果不释放的话会导致内存泄漏。所以要在取消订阅的情况下,继续完成工作线程里的流程(如对db的操作等),就要另想办法。
查找一番后,发现一种方式比较不错,使用ReplaySubject来完成任务,先上代码:
ReplaySubject<Long> replaySubject; Consumer<Long> consumer; Disposable disposable; @Override protected void onCreate(Bundle savedInstanceState) { ...... replaySubject = ReplaySubject.create(); observable = Observable.just(123L) .map(new Function<Long, Long>() { @Override public Long apply(Long data) { Log.d("tag", ">>>>>1>>>>> data=" + data); try { // emulate long time operation Thread.sleep(15000); Log.d("tag", ">>>>>2>>>>> data=" + data); } catch (InterruptedException e) { e.printStackTrace(); } return data; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); consumer = new Consumer<Long>() { @Override public void accept(Long data) { Log.d("tag", ">>>>>3>>>>> data=" + data); textView.setText("get data : " + data); } }; observable.subscribe(replaySubject); disposable = replaySubject.subscribe(consumer); } @Override protected void onDestroy() { ...... Log.d("tag", "~~~~~~~~~~~~~"); disposable.dispose(); consumer = null; }这样在activity退出时ReplaySubject依然订阅着,使得工作线程继续完成任务,而Consumer 则可以消除以免内存泄漏。
当然如果大家有更好的方法,希望不吝指教。谢谢
相关文章推荐
- 驰骋工作流程引擎,ccflow,如何把子线程的数据汇总到合流节点表单中去?
- 略谈如何从工作线程中弹出对话框
- 如何在工作线程中创建窗口?
- Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(下)
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
- 如何保证工作线程就创建一次,永久适用
- 如何去理解“DNS服务器”的工作流程
- 工作线程中如何更新界面
- 如何做售前-售前工作职责和流程
- Linux内核分析课程--完成一个简单的时间片轮转多道程序内核代码,理解操作系统是如何工作的
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
- 源码分析Rxjava2是如何完成链式调用的
- WPF:如何在工作线程中更新窗体的UI元素(Dispatcher机制)
- JAVA项目开发完成后期修改BUG和测试的工作流程
- 如何在工作线程中更新窗体的UI元素(Dispatcher机制)
- 关于MFC中工作线程如何正常退出
- [SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(四):任务表单、流转的简要图示
- 如何在Automator应用程序中自动化任务并创建工作流程
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程