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

来源:互联网 发布:网络爬虫php 编辑:程序博客网 时间:2024/05/22 05:34

使用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);    }}

(双方没有指定线程)订阅关系在主线程: 双方都走在主线程里
这里写图片描述

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

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

这里写图片描述

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

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

这里写图片描述

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

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

这里写图片描述
测试结束!!!

一般标准是这样写 观察者主线程更新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

原创粉丝点击