Rxjava 我也用了有一小段时间了,谈谈感想 书写起来的确很轻松,内涵大量的操作符可以实现几乎你所有的操作,但是标签太多,初学很难记,我简单的总结了一些常用的操作符
在此推荐一个Rxjava的中文文档,对初学者很有用https://mcxiaoke.gitbooks.io/Create.html
Rxjava最好配合lambda一起使用,那样代码看起来会更加美观,最起码看起来逼格也稍稍高一点吧
一下是我的测试代码:
如果你的IDE是Android stuido,你需要做一下如下配置,
1。首先你得保证studio用的jdk是1.8以上
2.AD默认是不支持lambda的使用,不过牛逼的大神们已经帮我们实现了
在build:gradle(project:"projectName")中配置maven库
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
}
}
allprojects {
repositories {
mavenCentral()
}
}
然后build:gradle(module:app)中做如下配置
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
这样就能支持lambda表达式了 如果不行请参照http://blog.csdn.net/lihenair/article/details/50360924
3.接下来ctrl+shift+F10就能运行单个测试方法了
package com.sumavision;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
/**
* Created by sharpay on 16-10-18.
*/
public class RxJavaTest {
List<Integer> testList;
List<String> testCharList;
public RxJavaTest(){
testList = new ArrayList<>();
testCharList = new ArrayList<>();
for(int i = 0; i < 9; i++){
testList.add(i);
testCharList.add(String.valueOf((char)(65 + i)));
}
}
//****************************以下是创建操作***************************
/**
* desc 创建一个Observable
*/
@Test
public void testCreate(){
String str = "Sharpayzara";
Observable.create((new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext(str);
}
})).subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
//lambda简易表达式
Observable.create(subscriber -> subscriber.onNext(str))
.subscribe(result-> System.out.println(result));
}
/**
* desc 创建一个发射指定值的Observable
*/
@Test
public void testJust(){
Observable.just("222","333") //有多少个参数就发射多少次 如果把几个参数都放到一个list中可用from操作符代替
.subscribe(str -> System.out.println(str));
}
/**
* desc 直到有观察者订阅时才创建Observable,并且为每个观察者创建一个新的Observable
*/
@Test
public void testDefer(){
Observable.defer(() -> Observable.just("testDefer"))
.subscribe(str -> System.out.println(str));
}
/**
* desc 迭代Iterable
*/
@Test
public void testFrom(){
List<String> list = new ArrayList<>();
list.add("http://");
list.add("ftp://");
Observable.from(list)
.subscribe(url -> System.out.println(url));
}
/**
* desc 延时+间隔循环 创建一个按固定时间间隔发射整数序列的Observable 单位毫秒
*/
@Test
public void testInterval(){
Observable.interval(1, 3000, TimeUnit.MILLISECONDS) //junit测试不出来
//延时3000 ,每间隔3000,时间单位
.subscribe(i -> System.out.println(i));
}
/**
* desc 定时器 它在一个给定的延迟后发射一个特殊的值 单位毫秒
*/
@Test
public void testTimer(){
Observable.timer(1 , TimeUnit.MILLISECONDS) //junit测试不出来
.subscribe(i -> System.out.println(i));
}
//*************************************以下是变换操作***************************
/**
* desc 定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一个值
*/
@Test
public void testBuffer(){
Observable.from(testList)
.buffer(3)
.subscribe(input -> System.out.println(input));//默认用[]包裹数据
}
/**
* desc Map操作符 Observable发射的每一项数据应用一个函数,执行变换操作
*/
@Test
public void testMap(){
Observable.from(testList)
.map(i -> i + "map") //返回的是一个发射的值 而不是Observable
.subscribe(str -> System.out.println(str));
}
/**
* desc flatMap操作符 FlatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable
*/
@Test
public void testFlatMap(){
Observable.just(testList)
.flatMap(i -> Observable.from(i)) //返回的是一个Observable 而不是发射的值
.flatMap(j -> handData(j))
.subscribe(str -> System.out.println(str));
/* //实战中的运用 获取第一个栏目下的节目列表名称和评分
SumaClient.getRetrofitInstance(PlayerRetrofit.class).getProgramListTopic(SumaClient.getCacheControl(),"ca1z3e") // 返回Observable<ProgramListTopic>
.map(programListTopic -> programListTopic.getItems()) //返回一个栏目列表的list
.flatMap(itemsBeen -> SumaClient.getRetrofitInstance(PlayerRetrofit.class).getProgramListData(itemsBeen.get(0).getId(),itemsBeen.get(0).getName(),1,30)) //根据第一个栏目的id和name获取一页节目列表数据
.map(programListData -> programListData.getItems()) //从返回的json对象中取出节目列表数据
.flatMap(itemsBeen1 -> Observable.from(itemsBeen1)) //遍历节目列表数据 发射带有单个节目数据的Observable
.subscribe(itemsBean -> System.out.println(itemsBean.getName() + itemsBean.getPrompt())); //取出打印出节目名称和评分信息*/
}
/**
* desc 处理数据
*/
public Observable<String> handData(Integer num){
return Observable.create(subscriber -> subscriber.onNext(num+"flatmap"));
}
/**
* desc 过滤操作符 只发射通过了谓词测试的数据项
*/
@Test
public void testFilter(){
Observable.from(testList)
.filter(x -> x > 5) //即 x -> x > 5?true:false
.subscribe( x -> System.out.println(x));
//比方说每隔一周自动清理一次glide的图片缓存
Observable.just(context.getSharedPreferences("OneWeek", Context.MODE_PRIVATE)
.getLong("clearCache", System.currentTimeMillis()))
.filter(beforeTime -> (System.currentTimeMillis() - beforeTime)/1000/60/24 > 6)
.doOnNext(x -> saveClearCacheLog())
.observeOn(Schedulers.io())
.subscribe(x -> Glide.get(context).clearDiskCache());
}
private void saveClearCacheLog(){
SharedPreferences preferences = context.getSharedPreferences("OneWeek", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putLong("clearCache", System.currentTimeMillis());
editor.commit();
}
/**
* desc 只发射第一项(或者满足某个条件的第一项)数据
*/
@Test
public void testFirst(){
/*Observable.from(testList)
.first()
.subscribe(x -> System.out.println(x));*/
Observable.from(testList)
.first(x -> x > 5)
.subscribe(x -> System.out.println(x));
}
/**
* desc 只发射最后项(或者满足某个条件的最后项)数据
*/
@Test
public void testLast(){
Observable.from(testList)
.last(x -> x < 5)
.subscribe(x -> System.out.println(x));
}
/**
* desc 抑制Observable发射的前N项数据
*/
@Test
public void testSkip(){
Observable.from(testList)
.skip(2) //丢弃前两项发射的数据
.subscribe(x -> System.out.println(x));
}
/**
* desc 抑制Observable发射的后N项数据
*/
@Test
public void testSkipLast(){
Observable.from(testList)
.skipLast(2) //丢弃后两项发射的数据
.subscribe(x -> System.out.println(x));
}
/**
* desc 只发生Observable的前N项数据
*/
@Test
public void testTake(){ //takeLast同理
Observable.from(testList)
.take(2) //只接受前两项发射的数据
.subscribe(x -> System.out.println(x));
}
//****************************以下是合并(多输入 单输出)操作***************************
/**
* desc 通过一个函数将多个Observables的发射物结合到一起,基于这个函数的结果为每个结合体发射单个数据项。
*/
@Test
public void testZip(){
testCharList.add("J");
Observable.zip(Observable.from(testList),Observable.from(testCharList),(x,y) -> x+y)
.subscribe(z -> System.out.println(z));
}
/**
* desc 使用Merge操作符你可以将多个Observables的输出合并
*/
@Test
public void testMerge(){
Observable.merge(Observable.from(testList),Observable.from(testCharList))
.subscribe(z -> System.out.println(z));
}
//****************************以下是辅助操作***************************
/**
* desc 在序列的开头插入指定的数据序列
*/
@Test
public void testStartWith() {
Observable.from(testCharList)
.startWith("test")
.subscribe(z -> System.out.println(z));
}
/**
* desc 延迟一段指定的时间再发射来自Observable的发射物
*/
@Test
public void testDelay(){
new Thread(() -> { Observable.from(testCharList) //看来junit在线程里也测不出来
.delay(1000,TimeUnit.MILLISECONDS)
.subscribe(z -> System.out.println(z));
}).start();
}
/**
* desc 仅在过了一段指定的时间还没发射数据时才发射一个数据
*/
@Test
public void testDeBounce(){
Observable.from(testCharList)
.delay(2,TimeUnit.MILLISECONDS)//每2毫秒发一次
.debounce(10,TimeUnit.MILLISECONDS)//每10毫秒接受一次 a,b,c,d会被丢弃 e通过,
.subscribe(x -> System.out.println(x));
}
/**
* desc 与debounce类似 作用都是减少函数被调用的次数 它会定期发射这个时间段里源Observable发射的第一个数据
*/
@Test
public void testThrottleFirst(){
Observable.from(testCharList)
.delay(10,TimeUnit.MILLISECONDS)
.throttleFirst(30,TimeUnit.MILLISECONDS) //例如用于防止按钮重复点击
.subscribe(z -> System.out.println(z));
}
/**
* desc 对原始Observable的一个镜像,如果过了一个指定的时长仍没有发射数据,它会发一个错误通知
*/
@Test
public void testTimeout(){
Observable.from(testCharList)
.delay(10, TimeUnit.MILLISECONDS)
.timeout(5, TimeUnit.MILLISECONDS)
.subscribe(z -> System.out.println(z),error -> System.out.println("error"));
}
/**
* desc 处理数据 不改变数据流 (日志保存等操作)
*/
@Test
public void testDoOnNext(){
Observable.from(testCharList)
.doOnNext(x -> saveData(x))
.subscribe(y -> System.out.println(y));
}
private void saveData(String str){
//保存数据的操作
}
}
初学的时候可以保存下来,偶尔过目一下,毕竟都是很好理解的且常用的
要是对你有用 点赞鼓励一下吧 !