安卓中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
- 安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系
- Android 简单的观察者与被观察者
- 观察者模式的简单使用
- RxJava与RxAndroid 被观察者的创建
- RxJAVA使用util包的类实现简易观察者与被观察者通信
- 观察者模式的使用
- 观察者模式的使用
- 观察者模式的使用
- 观察者模式的异步进度条
- 使用观察者模式观察线程的生命周期
- 从观察者模式的角度看RxJava
- 理解RxJava,RxAndroid的观察者模式
- Rxjava介绍(观察者+异步)
- 观察者模式的简单应用
- 观察者模式的简单实现
- C++ 简单的观察者模式
- 简单实现的观察者模式
- NSNotificationCenter(观察者模式) 的使用
- Lambda 表达式有何用处?如何使用?
- 软考设计模式——装饰模式(C++)
- 阿里史上首款AI硬件设备,为何如此“听话”?
- mysql格式化日期
- 套接字中connect阻塞与非阻塞问题
- 安卓中Rxjava(观察者模式、异步)的简单使用(1) 观察者与被观察者线程之间的关系
- 安卓自定义view
- android TextView滚动和转义换行等相关问题
- python I/O编程小笔记
- windows系统 忘记mysql密码解决方案
- Java反射-Method
- PHP限制网页只能在微信内置浏览器中查看并显示
- 最简单的基于FFmpeg的AVDevice例子(屏幕录制)
- ElasticSearch入门