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的确可以中断订阅。而且也可以看出被观察者的动作实在同一线程运行的,只有等上一次动作结束才能开始下一次动作。

原创粉丝点击