菜单

实战知识梳理

2019年4月3日 - 注册免费送38元体验金

福睿斯xJava2 实战类别小说

凯雷德xJava二 实战知识梳理(一) – 后台执行耗费时间操作,实时通报 UI
更新

BMWX伍xJava贰 实战知识梳理(贰) –
总计一段时间内数据的平均值

兰德酷路泽xJava二 实战知识梳理(三) –
优化搜索联想效能

奥迪Q3xJava二 实战知识梳理(4) – 结合 Retrofit
请求音讯资讯

凯雷德xJava2 实战知识梳理(五) –
简单及进阶的轮询操作

卡宴xJava二 实战知识梳理(六) –
基于错误类型的重试请求

奥迪Q五xJava二 实战知识梳理(7) – 基于 combineLatest
达成的输入表单验证

BMWX叁xJava2 实战知识梳理(8) – 使用 publish + merge
优化先加载缓存,再读取网络数据的央求过程

安德拉xJava2 实战知识梳理(九) – 使用 timer/interval/delay
完毕职分调度

奥德赛xJava二 实战知识梳理(10) – 显示器旋转导致 Activity
重建时回涨职务

CR-VxJava二 实战知识梳理(1一) –
检查实验网络状态并机关心珍视试请求

PAJEROxJava二 实战知识梳理(1贰) – 实战讲解 publish & replay & share & refCount
& autoConnect

景逸SUVxJava二 实战知识梳理(1三) –
如何使得错误发生时不自行终止订阅关系

CRUISERxJava二 实战知识梳理(1四) – 在 token 过期时,刷新过期 token
并再一次发起呼吁

安德拉xJava二 实战知识梳理(一5) – 达成叁个简短的 MVP + LANDxJava + Retrofit
应用


一、前言

接触RxJava2早就很久了,也看了网上的好多稿子,发现中央都以在对RxJava的为主考虑介绍之后,再去对11操作符进行分析,然则看了随后觉得过了不久就忘了。

神蹟的火候来看了开源项目
RxJava-Android-Samples,那里一起介绍了十七种RxJava2的使用情况,它从事实上的应用场景出发介绍RxJava2的选用,尤其契合对于RxJava2曾经有始发领会的开发者更是地去上学怎么着将其采纳到实在支付个中。

从而,小编打算跟着这几个项目标笔触编写壹密密麻麻实战的牵线并成功示范代码编写,并对该实例中用到的学识进行介绍,做到学以致用。上面,就从头率先个例证的求学,源码的仓库为:RxSample

二、示例

贰.一 应用场景

当大家须求举行部分耗费时间操作,例如下载、访问数据库等,为了不封堵主线程,往往会将其放在后台举行拍卖,同时在处理的历程中、处理实现后布告主线程更新UI,那里就关系到了后台线程和主线程之间的切换。首先想起一下,在从前我们一般会用以下三种方法来达成那1功能:

那么,让大家看1些在RxJava中如何完毕那1须求。

2.二 示例代码

大家的界面上有2个按钮mTvDownload,点击之后会倡导四个耗费时间的天职,那里大家用Thread.sleep来模拟耗费时间的操作,每隔500ms咱俩会将如今的进程通报主线程,在mTvDownloadResult中显妥帖前拍卖的进度。

public class BackgroundActivity extends AppCompatActivity {

    private TextView mTvDownload;
    private TextView mTvDownloadResult;
    private CompositeDisposable mCompositeDisposable = new CompositeDisposable();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_background);
        mTvDownload = (TextView) findViewById(R.id.tv_download);
        mTvDownloadResult = (TextView) findViewById(R.id.tv_download_result);
        mTvDownload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startDownload();
            }
        });
    }

    private void startDownload() {
        final Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {

            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                for (int i = 0; i < 100; i++) {
                    if (i % 20 == 0) {
                        try {
                            Thread.sleep(500); //模拟下载的操作。
                        } catch (InterruptedException exception) {
                            if (!e.isDisposed()) {
                                e.onError(exception);
                            }
                        }
                        e.onNext(i);
                    }
                }
                e.onComplete();
            }

        });
        DisposableObserver<Integer> disposableObserver = new DisposableObserver<Integer>() {

            @Override
            public void onNext(Integer value) {
                Log.d("BackgroundActivity", "onNext=" + value);
                mTvDownloadResult.setText("Current Progress=" + value);
            }

            @Override
            public void onError(Throwable e) {
                Log.d("BackgroundActivity", "onError=" + e);
                mTvDownloadResult.setText("Download Error");
            }

            @Override
            public void onComplete() {
                Log.d("BackgroundActivity", "onComplete");
                mTvDownloadResult.setText("Download onComplete");
            }
        };
        observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver);
        mCompositeDisposable.add(disposableObserver);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCompositeDisposable.clear();
    }
}

实际上的运维结果如下:

3、示例解析

三.一 线程切换

在上边的事例中,涉及到了两类别型的操作:

那么,那三种档次操作所运维的线程是在哪里钦定的吗,关键是上面这句:

observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(disposableObserver);

那多个函数刚开端的时候很有一点都不小可能率弄混,作者是那样记的,subscribeOns开头,能够了然为“上游”开首的谐音,也正是上游实施的线程。

关于那五个函数,还有少数认证:多次调用subscribeOn,会以第一回的为准;而屡屡调用observeOn则会以最终3回的为准,可是貌似大家都不会这么干,就不举例子了。

3.二 线程的花色

subscribeOn/observeOn注册免费送38元体验金,都务求传入二个Schedulers的子类,它就表示了运营线程类型,下边大家来看一下都有啥样选取:

如上是在io.reactivex.schedulers包中,提供的Schedulers,而若是大家导入了下边包车型客车依赖性,那么在io.reactivex.android.schedulers下,还有额外的多个Schedulers可选:

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

三.3 使用 CompositeDisposable 对下游举行保管

如果Activity要被灭绝时,我们的后台任务未有实施完,那么就会造成Activity不可能健康回收,而对此每1个Observer,都会有一个Disposable指标用于管理,而RxJava提供了一个CompositeDisposable类用于管理这个Disposable,大家只供给将其将入到该集合个中,在ActivityonDestroy方法中,调用它的clear主意,就能幸免内部存款和储蓄器泄漏的发生。

四、小结

其一体系的第三篇文章,我们介绍了什么样利用subscribeOn/observeOn来落到实处后台执行耗费时间职责,并通报主线程更新进度。


越来越多小说,欢迎访问作者的 Android 知识梳理类别:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图