Retrofit2高级教程 一 CompositeDisposable是否能够真的中断订阅
来源:互联网 发布:淘宝上卖的觅心猎手 编辑:程序博客网 时间:2024/06/08 08:21
这次主要探究CompositeDisposable是否能够真的中断订阅
首先贴上本次实验代码
public class MainActivity extends AppCompatActivity { private Button mTvDownload; private TextView mTvDownloadResult; private Button mTvDownloadStop; private CompositeDisposable mCompositeDisposable = new CompositeDisposable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvDownload = (Button) findViewById(R.id.tv_download); mTvDownloadResult = (TextView) findViewById(R.id.tv_download_result); mTvDownloadStop = (Button) findViewById(R.id.tv_download_stop); mTvDownload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { start(); } }); mTvDownloadStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCompositeDisposable.clear(); } }); } private void start() { Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> e) throws Exception { for (int i = 0; i < 10; i++) { try { Thread.sleep(500); //模拟下载的操作。 } catch (InterruptedException exception) { if (!e.isDisposed()) { e.onError(exception); } } Log.v("zzwa",""+i); e.onNext(i); } e.onComplete(); } }); DisposableObserver<Integer> disposableObserver = new DisposableObserver<Integer>() { @Override public void onNext(Integer value) { Log.d("DownloadActivity", "onNext=" + value); mTvDownloadResult.setText("" + value); } @Override public void onError(Throwable e) { mTvDownloadResult.setText("失败"); } @Override public void onComplete() { mTvDownloadResult.setText("成功"); } }; observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver); mCompositeDisposable.add(disposableObserver); } @Override protected void onDestroy() { super.onDestroy(); mCompositeDisposable.clear(); }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/tv_download" android:text="开始下载" android:gravity="center" android:layout_width="match_parent" android:layout_height="40dp"/> <TextView android:id="@+id/tv_download_result" android:gravity="center" android:layout_width="match_parent" android:layout_height="40dp"/> <Button android:id="@+id/tv_download_stop" android:gravity="center" android:layout_width="match_parent" android:layout_height="40dp" android:text="停止"/></LinearLayout>
依赖
//RxJavacompile 'io.reactivex.rxjava2:rxjava:2.0.1'compile 'io.reactivex.rxjava2:rxandroid:2.0.1'//Retrofitcompile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:converter-gson:2.0.0'compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
我们按下下载按钮,看见数字在变大,当我们按下停止按钮,数字就没有变化,从这里可以看到订阅的确被停止了,但我们看logcat的记录
09-19 09:41:15.436 3745-3910/zzw.myapplication V/zzwa: 0
09-19 09:41:15.946 3745-3910/zzw.myapplication V/zzwa: 1
09-19 09:41:16.446 3745-3910/zzw.myapplication V/zzwa: 2
09-19 09:41:16.946 3745-3910/zzw.myapplication V/zzwa: 3
09-19 09:41:16.976 3745-3910/zzw.myapplication V/zzwa: 4
09-19 09:41:17.476 3745-3910/zzw.myapplication V/zzwa: 5
09-19 09:41:17.976 3745-3910/zzw.myapplication V/zzwa: 6
09-19 09:41:18.476 3745-3910/zzw.myapplication V/zzwa: 7
09-19 09:41:18.976 3745-3910/zzw.myapplication V/zzwa: 8
09-19 09:41:19.476 3745-3910/zzw.myapplication V/zzwa: 9
从这里可以看到被观察者的动作并没有被停止,但没有向观察者放出订阅。
而且如果我们在按下停止按钮之后,如果又快速的按下开始下载,这个数字不会立刻改变,这个是为什么呢?
这是因为上一次点击订阅产生的被观察者的动作还没有结束,只有等他结束后才能开始这一次点击订阅产生的被观察者的动作。
所以最后我们知道CompositeDisposable这个能够中断订阅对观察者传送信息,但本身被观察者的动作已经开始,这个就不能停止。所CompositeDisposable的确可以中断订阅。而且也可以看出被观察者的动作实在同一线程运行的,只有等上一次动作结束才能开始下一次动作。
- Retrofit2高级教程 一 CompositeDisposable是否能够真的中断订阅
- 你真的会用Retrofit2吗?Retrofit2完全教程
- 你真的会用Retrofit2吗?Retrofit2完全教程
- 你真的会用Retrofit2吗?Retrofit2完全教程
- 你真的会用Retrofit2吗?Retrofit2完全教程
- 【转载】你真的会用Retrofit2吗?Retrofit2完全教程
- 关于rxjava2的CompositeDisposable
- 【呆子谈成长】:知识是否真的能够改变命运?
- 安卓是否真的能够将苹果击败?
- Retrofit2 简明教程(一)
- Retrofit2 简明教程(一)
- SQL的高级教程(一)
- 多线程模型真的能够提高效率吗?
- C++真的能够王者归来吗?
- C++真的能够王者归来吗?
- 数据库高级教程(一)
- Retrofit2的简单使用(一)
- Retrofit2的简单用法(一)
- 用C++实现HTTP服务器
- DataBinding基本使用(5)
- 【转】抓包工具Charles的使用心得
- STM32输出比较模式和PWM模式
- 开始记录深度学习工作站的学习之路
- Retrofit2高级教程 一 CompositeDisposable是否能够真的中断订阅
- QT中PRO文件写法的详细介绍,很有用,很重要!
- iOS UITableView~members(常用成员方法)
- 编码习惯-函数编写建议
- 快速排序Java(指针双向从头尾向中间扫描)
- 5w每秒的高并发优化:电商秒杀与抢购
- oracle odbc连接us7ascii字符集乱码的问题
- 解决mac 10.10 拖拽QUrls fileid=xxx
- IO编程