安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系

时间:2022-08-08 17:45:47

使用Rxjava需要加入两个依赖:
compile ‘io.reactivex:rxjava:1.0.14’
compile ‘io.reactivex:rxandroid:1.0.1’

结合Retrofit使用加入的依赖
compile ‘com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0’

Rxjava用在异步操作上面 理解为网上大佬们说的警察和小偷

 Observa:     观察者|警察
Observable :被观察者|小偷
当小偷|被观察者做出动作(偷东西的动作,指定动作),警察|观察者就要做出反应去抓他(响应操作)

//简单使用

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //观察者,消费事件
        final Observer<String> observer = new Observer<String>() {
            //完成
            @Override
            public void onCompleted() {
                Log.e("observer", "onCompleted");
            }
            //异常
            @Override
            public void onError(Throwable e) {
                Log.e("observer", "onError");
            }
            //发出
            @Override
            public void onNext(String s) {
                Log.e("观察者", "线程:" + s+Thread.currentThread().getName());
            }
        };
        //被观察者,生成数据
        final Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                //生成数据。。。
                subscriber.onNext("1");
                subscriber.onNext("2");
                subscriber.onNext("3");
                //完成
                //调用onCompleted后的方法之后调用的onNext是不输出的 因为已经提交过了
                subscriber.onCompleted();
                subscriber.onNext("4");
                Log.e("被观察者","线程:"+Thread.currentThread().getName());
            }
        });
        // subscribe():订阅关系
        // subscribeOn():给被观察者指定线程
        // observeOn():给观察者指定线程
        //建立订阅关系 被观察者(生产者)订阅观察者/要求观察者观察等一系列操作
        //如果观察者没有指定线程 就跟随被观察者订阅的线程 而观察者指定了线程 被观察者还是跟随自己的线程 跟被观察者没有关系
        //现在是在主线程发生订阅关系
        observable.subscribe(observer);

    }
}

(双方没有指定线程)订阅关系在主线程: 双方都走在主线程里
安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系

2.
(双方没有指定线程)订阅关系在子线程:双方都走在子线程里

 //在子线程里发生订阅关系
  new Thread() {
            @Override
            public void run() {
                super.run();
                observable.subscribe(observer);
            }
        }.start();

安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系

3.
可以看到 就算订阅关系在子线程,但如果给被观察者指定了线程 还是会根据指定的线程走
并且 如果观察者没有指定线程 会根据被观察者指定的线程走
可以理解为 小偷去哪 警察就跟他去哪

//在子线程发生订阅关系 但是:
//被观察者:指定了线程
 new Thread() {
            @Override
            public void run() {
                super.run();
           //给被观察者指定线程 observable.subscribeOn(AndroidSchedulers.mainThread()).subscribe(observer);
            }
        }.start();

安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系

4.
如果给观察者指定了线程 被观察者不会跟着观察者的线程走 还是会根据在订阅关系在哪个线程就跟哪个线程走
理解为小偷不会跟着警察走

//给观察者指定主线程
 new Thread() {
            @Override
            public void run() {
                super.run();
          //给观察者指定线程 observable.observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
            }
        }.start();

安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系
测试结束!!!

一般标准是这样写 观察者主线程更新Ui,被观察者子线程 生成数据 耗时操作

new Thread() {
            @Override
            public void run() {
                super.run();
                //Schedulers.io(): 子线程 I/O 操作(读写文件、读写数据库、网络信息交互等)
                           //观察者指定主线程 更新ui //被观察者指定子线程 //订阅
                observable.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe(observer);
            }
        }.start();

搞清了它们之间的线程关系 才能灵活使用
总结 :
1.(双方没有指定线程的情况下): 订阅关系在哪个线程,双方就会在哪个线程走

2.(被观察者指定了线程,观察者没有指定线程): 观察者就会跟着被观察者的线程走 {理解为警察跟着小偷走}

3.(被观察者没有指定线程,观察者指定了线程): 被观察者不会跟着观察者的线程走 这时候订阅关系在哪个线程 被观察者就走在哪个线程 {理解为小偷不会跟着警察走}

4.(双方都指定了线程): 双方根据双方各指定的线程走

详情看:

http://gank.io/post/560e15be2dca930e00da1083#toc_5