初涉RxAndroid .from() .just() 以及线程操作

转载请注明出处:王亟亟的大牛之路

上一篇,整了个利用RxJava下载图片刷UI的一个小案例,从者一篇开始将要一部分一部分的“拆”RxJava(会写一系列,每一篇内容精良精简)

那从何学起?官网Wiki:https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava

先从简单的from() 和just()方法开始,先看下例子实现的内容(2部分,一个类似于短信验证码等待的操作,一个就是遍历数组打Log)

效果:
这里写图片描述

Log部分
这里写图片描述

RxJava自带了2个快捷创建事件队列的方法 from() just()前者可传入一个数组,后者可以传入多个参数然后跑一个call()的回调。

代码如下:

  Observable.just(1, 3, 4, 5, 6).subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        LogUtils.d("自动计算到 " + integer);
                    }
                });




                String aa[]={"1","2","3","4","5"};
                Observable btn2Observable= Observable.from(aa);
                btn2Observable.subscribe(new Action1() {
                    @Override
                    public void call(Object o) {
                             LogUtils.d("自动计算到 " + o);
                    }
                });

像这边的行为类似于我们的 for循环然后每一个循环里println一个数,那么问题来了,这代码量看上去还比for长一点,有什么优势?

卖个关子我们看第二个例子

效果图中我们的按钮的字在不断的被刷新,类似的效果可以用Handler或者是RunOnUiThread(好像大小写有拼错,懒得查了理解就好)实现,那又为什么用RxJava呢? 看代码说话

在类里面声明了我们的观察者和被观察者,被观察者进行着我们的业务逻辑,观察者做监听。

      Observable.just(1, 3, 4, 5, 6).subscribeOn(Schedulers.newThread()).subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        LogUtils.d("自动计算到 " + integer);
                    }
                });

                String aa[] = {"1", "2", "3", "4", "5"};
                Observable btn2Observable = Observable.from(aa);
                btn2Observable.subscribeOn(Schedulers.newThread()).subscribe(new Action1() {
                    @Override
                    public void call(Object o) {
                        LogUtils.d("自动计算到 " + o);
                    }
                });

这里看完观众们又要问了,这代码量也没少啊,RxJava优势在哪?

那我们再贴一段

 btn1Observable.subscribeOn(Schedulers.newThread())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(btn1Oserver);

在我们的btn1的click行为里我们做了这么个操作,子线程执行逻辑内容,主线程刷UI。

现在我来回答刚才的疑问

优势在哪:
1.所有的行为都有相应的回调,而不用我们人工去申明额外的回调函数
2.异步,异步,异步!!!重要的事情说三遍

无论你的程序逻辑变得多么的复杂,代码构造依然整洁明了。

那既然提到了异步的内容,这边来说一下负责线程操作的类Scheduler

默认情况下哪走了subscribe()哪个线程就要干这件事

来例举下可用的一些工作状态

.immediate() :默认状态,哪用算哪

.newThread(): 开新线程做这件事

.io(): 跟newThread()差不多,不过在线程池大小上有差异,他是无限大

.computation():跟创建固定的线程池操作

.mainThread():在主线程做事

那既然说到了线程内容,再补充下如何设置线程

subscribeOn(): subscribe() 所发生的线程,也就是干活的线程

observeOn(): Subscriber 所运行在的线程,也就是的回调发生的线程

在例子中我有打出具体的线程ID,我们来看一下

主线程的

03-28 16:08:30.878 8717-8717/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity.onCreate(MainActivity.java:129): --->Main Thread  id 1

工作线程的

03-28 16:46:20.358 8717-6259/sample.wjj.rxandroidglidedemo D/LogUtils-MainActivity$3.call(MainActivity.java:91): 子线程id 3489

也就应正了这一点,我们可以决定我们要做的操作在哪执行,反复强调,异步!!!!让主线程尽量少干活(或者说,让他干他应该干的活)

源码地址:https://github.com/ddwhan0123/RxAndroidDemo

RxAndroidRxJava 的一个针对 Android 平台的扩展库,它可以帮助我们方便地进行异步编程和线程切换。在 RxAndroid ,我们可以使用 `observeOn` 操作符指定下游操作执行线程,使用 `subscribeOn` 操作符指定上游操作执行线程。 下面是一个简单的使用示例,假设我们需要从网络获取一张图片,然后在主线程显示该图片: ```java Observable.just(imageUrl) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(new Function<String, Bitmap>() { @Override public Bitmap apply(String url) throws Exception { // 从网络获取图片 return getImageFromUrl(url); } }) .subscribe(new Consumer<Bitmap>() { @Override public void accept(Bitmap bitmap) throws Exception { // 在主线程显示图片 imageView.setImageBitmap(bitmap); } }); ``` 上面的代码,`Observable.just(imageUrl)` 创建了一个发射单个数据项的 Observable 对象,该数据项是图片的 URL 地址。`subscribeOn(Schedulers.io())` 指定了上游操作执行线程IO 线程,即在子线程发起网络请求。`observeOn(AndroidSchedulers.mainThread())` 指定了下游操作执行线程为主线程,即在主线程进行图片显示操作。`map` 操作符将 URL 地址转换成了 Bitmap 对象,最后通过 `subscribe` 方法订阅 Observable,进行图片显示操作。 需要注意的是,RxAndroid 提供了多种线程调度器,如 `AndroidSchedulers.mainThread()`、`Schedulers.io()`、`Schedulers.computation()` 等,选择合适的线程调度器非常重要,可以避免因线程阻塞而导致的 ANR 错误和卡顿问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值