RxJava 和 RxAndroid 一 (基础)
1、RxJava 项目地址
https://github.com/ReactiveX/RxJava
2、RxAndroid 项目地址
https://github.com/ReactiveX/RxAndroid
3、RxJava 和 RxAndroid 的关系
RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发
4、RxJava和EventBus的区别?
https://www.zhihu.com/question/32179258/answer/54989242
5、RxAndroid的使用方法
compile 'io.reactivex:rxandroid:1.2.0'
6、如何查看RxAndroid最新版本?
http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22rxandroid%22
7、RxAndroid具体使用方法
http://gank.io/post/560e15be2dca930e00da1083#toc_14
http://blog.csdn.net/theone10211024/article/details/50435325
http://huxian99.github.io/tags/RxJava/
https://github.com/mcxiaoke/RxDocs
8、创建观察者
- package lib.com.myapplication;
- import android.support.v7.app.AppCompatActivity;
- import android.os.Bundle;
- import rx.Observer;
- import rx.Subscriber;
- public class Main2Activity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main2);
- //创建观察者 2 种方法
- Observer<String> observer = new Observer<String>() {
- @Override
- public void onCompleted() {
- }
- @Override
- public void onError(Throwable e) {
- }
- @Override
- public void onNext(String s) {
- }
- } ;
- // Subscriber 继承 Observer ,对Observer类做了扩展
- Subscriber<String> subscriber = new Subscriber<String>() {
- @Override
- public void onCompleted() {
- }
- @Override
- public void onError(Throwable e) {
- }
- @Override
- public void onNext(String s) {
- }
- } ;
- }
- }
- 从上文可以看到,Subscriber继承Observer, 只是 Subscriber对Observer做了一些扩展。Subscriber的使用和Observer完全一样。
- Subscriber 多了一个 onStart 方法
onStart()
: 这是Subscriber
增加的方法。它会在 subscribe 刚开始,而事件还未发送之前被调用,可以用于做一些准备工作,例如数据的清零或重置。这是一个可选方法,默认情况下它的实现为空。需要注意的是,如果对准备工作的线程有要求(例如弹出一个显示进度的对话框,这必须在主线程执行),onStart()
就不适用了,因为它总是在 subscribe 所发生的线程被调用,而不能指定线程。要在指定的线程来做准备工作,可以使用doOnSubscribe()
方法,具体可以在后面的文中看到。
- // Subscriber 继承 Observer ,对Observer类做了扩展
- Subscriber<String> subscriber = new Subscriber<String>() {
- @Override
- public void onCompleted() {
- }
- @Override
- public void onError(Throwable e) {
- }
- @Override
- public void onNext(String s) {
- }
- @Override
- public void onStart() {
- super.onStart();
- }
- } ;
9、创建被观察者
- //create方式
- Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
- @Override
- public void call(Subscriber<? super String> subscriber) {
- subscriber.onNext( "aa" ) ;
- subscriber.onNext( "bb" ) ;
- subscriber.onNext( "cc" ) ;
- subscriber.onCompleted();
- }
- });
- //just方式 最多支持10个数据
- Observable<String> observable1 = Observable.just( "aa" , "bb" , "cc") ;
- // 将会依次调用:
- // onNext("aa");
- // onNext("bb");
- // onNext("cc");
- // onCompleted();
- //from方式
- //1:集合
- List<String> list = new ArrayList<>() ;
- list.add( "aa" ) ;
- list.add( "bb" ) ;
- list.add( "cc" ) ;
- Observable<String> observable2 = Observable.from( list ) ;
- //2:数组
- String[] words = { "aa", "bb", "cc" };
- Observable<String> observable3 = Observable.from( words ) ;
- Call()方法:当
Observable
被订阅的时候,OnSubscribe
的call()
方法会自动被调用,事件序列就会依照设定依次触发(对于上面的代码,就是观察者Subscriber
将会被调用三次onNext()
和一次onCompleted()
)。这样,由被观察者调用了观察者的回调方法,就实现了由被观察者向观察者的事件传递,即观察者模式。
10、订阅
由于观察者可以由两种方式被创建,所以订阅的方式也有两种
- observable.subscribe( observer ) ;
- observable.subscribe( subscriber ) ;
Observable.subscribe(Subscriber)
的内部实现是这样的(仅核心代码):- // 注意:这不是 subscribe() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。
- // 如果需要看源码,可以去 RxJava 的 GitHub 仓库下载。
- public Subscription subscribe(Subscriber subscriber) {
- subscriber.onStart();
- onSubscribe.call(subscriber);
- return subscriber;
- }
- // 注意:这不是 subscribe() 的源码,而是将源码中与性能、兼容性、扩展性有关的代码剔除后的核心代码。
- 在subscribe() 中,首先会调用 onStart() 方法,这个方法前文已经介绍了,是可选的。接着会调用 call()方法,我们已经分析了在call()方法中会调用多次 onNext() ,最后调用 onCompleted().看到这里你就会突然明白原来subscribe() 方法其实相当于依次执行了:onStart() --> onNext()--> onCompleted()
- 从这也可以看出,在 RxJava 中,
Observable
并不是在创建的时候就立即开始发送事件,而是在它被订阅的时候,即当subscribe()
方法执行的时候。 Observer
和Subscriber
具有相同的角色,而且Observer
在subscribe()
过程中最终会被转换成Subscriber
对象- 将传入的
Subscriber
作为Subscription
返回。这是为了方便unsubscribe()
.
11、RxBus
你是否听说过EventBus , 他是android 中的事件总线。用rxjava同样可以实现android的事件总线功能,也就是RxBus.
关于rxbus 的基本说明在这里 http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/
然而这并没有什么卵用 !
下面是RxBus的封装版
- package lib.com.myapplication;
- import android.support.annotation.NonNull;
- import android.util.Log;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.List;
- import java.util.concurrent.ConcurrentHashMap;
- import rx.Observable;
- import rx.subjects.PublishSubject;
- import rx.subjects.Subject;
- /**
- * Created by ${zyj} on 2016/5/6.
- */
- public class RxBus {
- private static final String TAG = RxBus.class.getSimpleName();
- private static RxBus instance;
- public static boolean DEBUG = false;
- public static RxBus get() {
- if (instance == null) {
- synchronized (RxBus.class) {
- if (instance == null) {
- instance = new RxBus();
- }
- }
- }
- return instance;
- }
- private RxBus() {
- }
- private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<>();
- @SuppressWarnings("unchecked")
- public <T> Observable<T> register(@NonNull Object tag, @NonNull Class<T> clazz) {
- List<Subject> subjectList = subjectMapper.get(tag);
- if (null == subjectList) {
- subjectList = new ArrayList<>();
- subjectMapper.put(tag, subjectList);
- }
- Subject<T, T> subject;
- subjectList.add(subject = PublishSubject.create());
- if (DEBUG) Log.d(TAG, "[register]subjectMapper: " + subjectMapper);
- return subject;
- }
- public void unregister(@NonNull Object tag, @NonNull Observable observable) {
- List<Subject> subjects = subjectMapper.get(tag);
- if (null != subjects) {
- if ( observable != null && subjects.contains( observable )){
- subjects.remove((Subject) observable);
- }
- if (isEmpty(subjects)) {
- subjectMapper.remove(tag);
- }
- }
- if (DEBUG) Log.d(TAG, "[unregister]subjectMapper: " + subjectMapper);
- }
- public void post(@NonNull Object content) {
- post( content.getClass().getName(), content);
- }
- @SuppressWarnings("unchecked")
- public void post(@NonNull Object tag, @NonNull Object content) {
- List<Subject> subjectList = subjectMapper.get(tag);
- if (!isEmpty(subjectList)) {
- for (Subject subject : subjectList) {
- subject.onNext(content);
- }
- }
- if (DEBUG) Log.d(TAG, "[send]subjectMapper: " + subjectMapper);
- }
- private boolean isEmpty(Collection collection) {
- return null == collection || collection.isEmpty();
- }
- }
RxBus的使用
- package lib.com.myapplication;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import rx.Observable;
- import rx.functions.Action1;
- public class Activity1 extends AppCompatActivity {
- String tag = "tag" ;
- Observable<String> ob ;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity1);
- //创建被观察者
- ob = RxBus.get().register( tag , String.class ) ;
- //订阅观察事件
- ob.subscribe(new Action1<String>() {
- @Override
- public void call(String s) {
- System.out.println( "fff-- " + s );
- }
- }) ;
- //发送内容
- RxBus.get().post( tag , "我是内容" );
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- //取消订阅
- RxBus.get().unregister( tag , ob );
- }
- }
- 在Activity销毁的时候,要取消订阅服务 。 否则 post() 次数会随着post()调用逐渐增加
- 除了上面的简单使用外,还可以使用 Schedulers 、AndroidSchedulers 进行线程切换
RxJava 和 RxAndroid 二(操作符的使用)
RxJava 和 RxAndroid 一 (基础)的更多相关文章
- RxJava 和 RxAndroid 五(线程调度)
对rxJava不了解的同学可以先看 RxJava 和 RxAndroid 一 (基础)RxJava 和 RxAndroid 二(操作符的使用)RxJava 和 RxAndroid 三(生命周期控制和内 ...
- RxJava 和 RxAndroid 四(RxBinding的使用)
对Rxjava不熟悉的同学可以先看我之前写的几篇文章 RxJava 和 RxAndroid 一 (基础) RxJava 和 RxAndroid 二(操作符的使用) RxJava 和 RxAndroid ...
- RxJava 和 RxAndroid 二(操作符的使用)
前言:对Rx不了解的朋友可以先看我的第一篇博文 RxJava 和 RxAndroid 一 (基础),是对Rxjava的基本介绍 1.merge操作符,合并观察对象 List<String> ...
- RxJava和RxAndroid
现在RxJava和RxAndroid越来越火爆,自己在业余时间也学习了一下,感觉确实很好用,之前 为了完成页面刷新,数据请求,组件信息传递的时候,要使用handler,真的是逻辑思路很强,稍微不注意, ...
- [Android]基于RxJava、RxAndroid的EventBus实现
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4578699.html Github:https://gith ...
- RxJava 和 RxAndroid 三(生命周期控制和内存优化)
rxjava rxandroid 赵彦军 前言:对Rxjava.Rxandroid不了解的同学可以先看看 RxJava 和 RxAndroid RxJava 和 RxAndroid 二(操作符的使用) ...
- RxJava漫谈-RxAndroid使用
RxJava在github上的地址:https://github.com/ReactiveX/RxJava RxAndroid在github上的地址:https://github.com/Reacti ...
- 深入浅出RxJava(一:基础篇)
RxJava正在Android开发者中变的越来越流行.唯一的问题就是上手不容易,尤其是大部分人之前都是使用命令式编程语言.但是一旦你弄明白了,你就会发现RxJava真是太棒了. 这里仅仅是帮助你了解R ...
- RxJava 和 RxAndroid (生命周期控制和内存优化)
RxJava使我们很方便的使用链式编程,代码看起来既简洁又优雅.但是RxJava使用起来也是有副作用的,使用越来越多的订阅,内存开销也会变得很大,稍不留神就会出现内存溢出的情况,这篇文章就是介绍Rxj ...
随机推荐
- JAVA 设计模式 组合模式
用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模式. 结构
- PhotoKit框架介绍及使用
PhotoKit 是一套比 AssetsLibrary 更新更完整也更高效的ios照片处理库,对资源的处理跟 AssetsLibrary 有很大的不同.下面简单介绍下PhotoKit的几个基本概念 P ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- Linux ACL
ACL 是什么 ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表.它在UGO权限管理的基础上为文件系统提供一个额外的.更灵活的权限管理机制. ...
- css异常
1.0 样式的引用顺序不对会导致样式显示不正常.个人推荐:把别人写好的样式引用在最前面,自己写的放在后面. 2.0 UC手机浏览器 UC手机浏览器在识别到页面文字很多的情况下会自动放大字体优化阅读体验 ...
- 【Remoting】.Net remoting方法实现简单的在线升级(下篇:重启exe)
一.前言 上篇运用了.Net Remoting技术解决了本地与服务器版本对比,并下载更新包的过程. 本篇主要是应用Process,来实现重启程序的过程. 情景假设: Revit2 ...
- 解密 JavaScript 中的 this
this的工作原理 如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象. var parent = { method: function () { conso ...
- jQuery漂亮图标的垂直导航菜单
效果展示 http://hovertree.com/texiao/nav/3/ jQuery漂亮图标的垂直导航菜单 是一款当鼠标滑过菜单项时,会有一个背景遮罩层跟着鼠标移动,效果非常炫酷,图标还是矢量 ...
- 【原创】asp.net导出word 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 8000401a
我的服务器:windows server 2008(64位)+microsoft office 2007 企业版 业务:网站导出应聘word简历. 出现以下错误: 检索 COM 类工厂中 CLSID ...
- Kinect V2 基础教程之彩色图像
本程序为自己所写,参考素材包括微软官方例子和外文资料,自己做了部分的优化.解释的如果有问题,恳请大家指正. 后台代码: using System.ComponentModel; using Syste ...