Android RxJava的学习总结

 

      主要结合https://www.imooc.com/article/68834这篇来学习的,先提一下观察者模式的一个别名,就是:发布-订阅模式。

 

      在RxJava中有3种角色:


* Observable (被观察者)
* Observer  /Subscriber  (观察者/订阅者)
* Event      (事件)

 

      被观察者 Observables可以发出一系列的事件,发出的事件可以是诸多不同的场景,比如发送网络请求、执行数据库操作、文件操作,一个for循环等等。 然后当事件执行结束后,交给 Observer/Subscriber 的回调处理。一言以蔽之,被观察者一个一个事件发出来,然后 观察者/订阅者 收到,就是RxJava。  若事件从Observable产生,直到Observer/Subscriber 接收不需要其他处理,那么流程为: Obsevable -> Subscriber。主流程为以下三步:

      事件的产生发送:

      Observable发出一系列的事件

创建一个ObservableObservable observable = Observable.create(new Observable.OnSubscribe() {    @Override
    public void call(Subscriber subscriber) {        // 发送一个 Hello World 事件
        subscriber.onNext("Hello World!");        // 事件发送完成
        subscriber.onCompleted();
    }

这段代码可以理解为, Observable 发出了一个类型为 String ,值为 “Hello World!” 的事件,仅此而已。



作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网

  观察者/订阅者接送数据:

      比如常见的Rxbus,在活动中扮演订阅/观察者的监听Subscription,就是如下代码同样功能的部分:

// 创建一个ObserverObserver observer = new Observer() {    @Override
    public void onCompleted() {
        Log.i(TAG, "complete");
    }    @Override
    public void onError(Throwable e) {

    }    @Override
    public void onNext(String s) {
        Log.i(TAG, s);
    }
};
或者

// 创建一个SubscriberSubscriber subscriber = new Subscriber() {    @Override
    public void onCompleted() {
        Log.i(TAG, "complete");
    }    @Override
    public void onError(Throwable e) {

    }    @Override
    public void onNext(String s) {
        Log.i(TAG, s);
    }
};



Observer 是观察者, Subscriber 也是观察者,Subscriber 是一个实现了Observer接口的抽象类,对 Observer 进行了部分扩展,在使用上基本没有区别;

Subscriber 多了发送之前调用的 onStart() 和解除订阅关系的 unsubscribe() 方法。

并且,在 RxJava 的 subscribe 过程中,Observer 也总是会先被转换成一个 Subscriber 再使用。所以在这之后的示例代码,都使用 Subscriber 来作为观察者。



作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网

     事件的订阅:

最后,我们可以调用 subscribe 操作符, 进行事件订阅。

// 订阅事件observable.subscribe(subscriber);
在 Subscriber 实现的三个方法中,顾名思义,对应三种不同状态: 
1. onComplete(): 事件全部处理完成后回调 
2. onError(Throwable t): 事件处理异常回调 
3. onNext(T t): 每接收到一个事件,回调一次


作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网

=========================================================

   rxjava线程切换调度:

   可以通过 subscribeOn() 和 observeOn() 这两个方法来进行线程调度:

依然还是显示一张图片,不同的是,这次是从网络上加载图片

final ImageView ivLogo = (ImageView) findViewById(R.id.ivLogo);

Observable.create(new Observable.OnSubscribe() {    @Override
    public void call(Subscriber subscriber) {        try {
            Drawable drawable = Drawable.createFromStream(new URL("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2502144641,437990411&fm=80&w=179&h=119&img.JPEG").openStream(), "src");
            subscriber.onNext(drawable);
        } catch (IOException e) {
            subscriber.onError(e);
        }
    }
})        // 指定 subscribe() 所在的线程,也就是上面call()方法调用的线程
        .subscribeOn(Schedulers.io())        // 指定 Subscriber 回调方法所在的线程,也就是onCompleted, onError, onNext回调的线程
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber() {            @Override
            public void onCompleted() {

            }            @Override
            public void onError(Throwable e) {
                Log.e(TAG, e.toString());
            }            @Override
            public void onNext(Drawable drawable) {
                ivLogo.setImageDrawable(drawable);
            }
        });
所以,这段代码就做一件事,在 io 线程加载一张网络图片,加载完毕之后在主线程中显示到ImageView上。


作者:哈士奇WWW
链接:https://www.imooc.com/article/68834
来源:慕课网

    在比如发送http请求部分的核心代码:

//Rxjava 实现发协议
        Subscription subscription = observable.subscribeOn(Schedulers.io()) //在IO线程进行网络请求
                .observeOn(AndroidSchedulers.mainThread()) //回主线程去处理请求结果
                .subscribe(callback);

 

 

Observable.from  的用法:

 

    Observable.from  接收一个集合作为事件集,然后每次依次一个一个事件发送给给subscriber。下面以kotlin的代码举例:

package com.example.kotlindemo1

import android.databinding.DataBindingUtil
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.kotlindemo1.databinding.ActivityMainBinding
import rx.Observable

class MainActivity : AppCompatActivity() {



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding:ActivityMainBinding   = DataBindingUtil.setContentView(this,R.layout.activity_main)
        binding.txtShow.text = "hello,kotlin"
        Observable.from( intArrayOf(1, 2, 3).asIterable())
                  .subscribe {
                      Log.d("tag",it.toString())
                  }
    }
}

结果为1,2,3 ,依次日志打印出来了:

03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 1
03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 2
03-20 21:00:38.986 19024-19024/com.example.kotlindemo1 D/tag: 3
03-20 21:00:39.053 19024-19268/com.example.kotlindemo1 I/Adreno-EGL: : EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013_msm8974_refs/tags/AU_LINUX_ANDROID_LA.BF.1.1.3_RB1.06.00.01.181.013__release_AU (I48a9d37399)
    OpenGL ES Shader Compiler Version: E031.29.00.00


 

你可能感兴趣的:(android)