初识RxJava

最近Retrofit+Rxjavaandroid网络请求框架中脱颖而出,受到很多兄弟们的欢迎。在之前公司走的时候一部分网络框架已经替换成这个,但是由于不是负责的这个模块,所以只是粗略的了解一下,所以现在来进一步的了解一下这个框架的应用。

大概看了几篇博客和一些资料先自我总结一下:

Rxjava就是所谓的链式结构,主要以观察者模式来开发,可以让整个业务流程更加清晰,便于代码的可读性和可维护性,随着逻辑复杂,但是结构更加清晰。

下面先来了解一下RxJava基本使用方法

现在gradle文件中添加依赖

	compile 'io.reactivex:rxandroid:1.1.0'
	compile 'io.reactivex:rxjava:1.1.5'

然后了解一下rxjava中的几个名词

Observable被观察者  Observer观察者   Subscriber订阅    Observable Observer  通过Subscriber实现订阅关系

基本用法

1.定义Obervable

		Observable<String > observable = Observable.create(new Observable.OnSubscribe<String>() {
  
  
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello world");
                subscriber.onCompleted();
            }
        });

这样简单的数据传递模式,我们还可以通过以下方式对Observable进行定义

		Observable<String> myObservable = Observable.just("hello world");
  
  
		其返回对象也为Observable,可以大致看下源码
		public static <T> Observable<T> just(final T value) {
  
  
        		return ScalarSynchronousObservable.create(value);
    		}	

2.定义Observe

	Subscriber<String> subscriber = new Subscriber<String>() {
  
  
            @Override
            public void onStart() {
            }
            @Override
            public void onCompleted() {
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };

这里的Subscriber是对Observe进行了扩展,增加了onStart()方法,它是在事件未发生之前执行,可以用来做一些初始化工作。其他方法和obersve方法使用保持一直

这里的Observe也可支持不完整的定义Action0 he Actiion1

	Action1<String> onNextAction = new Action1<String>() {
  
  
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        };

这里的Aciotn1只有一个方法call(),只能传一个参数无返回值。还有类似Action0也只有一个方法call(),但是无参数无返回值;

3.订阅

observable.subscribe(subscriber);

或者

myObservable.subscribe(onNextAction);


4.map
操作符数据转化

	Observable.just("hello world").map(new Func1<String, String>() {
  
  
            @Override
            public String call(String s) {
                return s+"my heart";
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
            }
        });

这里正是rxjava的强大之处,可以通过map操作符进行转化,在我们正常的应用过程中我们也可以通过map操作符对数据进行处理,通过这种链式结果使我们的整个代码结果没有太大的影响,依然美观

以前我们在处理List数据的时候很多情况下要进行for循环,如果数据结果比较复杂的话,几个for循环套在一起,可能导致会出现一些不经意的错误,而且代码的可读性和可维护性都会降低,那么我们尝试用Rxjava的操作符来进行数据的处理

		query("helloWorld")
  
  
            .flatMap(new Func1<List<String>, Observable<String>>() {
            	@Override
            	public Observable<String> call(List<String> strings) {
                return Observable.from(strings);
            	}
        		})
           	.flatMap(new Func1<String, Observable<String>>() {
            	@Override
            	public Observable<String> call(String s) {
                return getTitle(s);
            	}
        		})
            .filter(new Func1<String, Boolean>() {  //过滤掉不满足条件的
            	@Override
            	public Boolean call(String s) {
                return s!=null;
            	}
        		})             
            .take(5)     //输出指定数量的结果
            .doOnNext(new Action1<String>() {
                    @Override
                    public void call(String s) {            //在每次输出前做一些额外的操作
                        Log.d("MainActivity","输出前对数据做一些操作");
                    }
                })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
            }
        });

这样的话可能看起来我们的代码变多了,但是我们的结果依旧清晰,就算结果数据复杂也不影响我们数据的可读性。

当然了我写的这些只是对map操作符的一些简单使用,更多,更强大的功能我们在后面的学习过程中在进行挖掘。

5线程切换

因为在andriod开发过程中,主线程中不能进行耗时操作,不然会引起程序crash。当然使用最多的是我们在进行网络请求的时候,之前会new Runable,或者使 AsynTask但是,就个人使用感觉有点麻烦,后来Volley推出了,用了挺长一段时间,但是相比较而言感觉还是rxjava的这种线程切换方式更加方便。

	Observable.just("hello","sdfsf", "sdfdf", "wrt")
  
  
    .subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
    .subscribe(new Action1<String>() {
        @Override
        public void call(String str) {
            Log.d(tag, "String:" + str);
        }
    });

subscribeOn用来指定io线程执行耗时操作,observeOn切换到主线程,执行非耗时性操作!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值