介绍:
RxJava 在 GitHub 主页上的自我介绍是 :
“a library for composing asynchronous and event-based programs using observable sequences for the Java VM”
(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。
其实就是-------------------异步。
重要的组成:
1.核心设计模式:观察者模式,(订阅发布设计模式)
2.操作符
3.线程调度器
优点:
异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。
还是一个词--------------简洁(逻辑简洁)
开始代码
导入依赖,但是依赖属实有点乱
/*RxAndroid所依赖的库*/
implementation 'io.reactivex:rxandroid:1.2.1'
implementation 'io.reactivex:rxjava:1.1.6'
一些操作介绍
1.基本使用
//RxAndroid基本使用
private void rxAndroidBase() {
//创建被观察者
Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
//开始发送的事件
e.onNext("家辉1");
e.onNext("家辉2");
//需要注意的是:开始发送的事件不能放到下面这两个方法的下面,还有这两个不能同时出现
//观察结束的时候回调
e.onComplete();
//异常的时候回调,没有执行
e.onNext("家辉3");
}
});
//创建观察者Subscriber是observer扩展的类,但是都差不多
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String value) {
Log.e("wjh", "onNext: "+value );
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
}
接收一个集合,对其一个一个观察
//创建一个集合
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6);
//一个一个输出
Observable.from(integers)
//如果不用错误和结束的那个方法直接new下方这个
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext : " + integer);
}
});
RxAndroid接收一个集合对象,对整个集合进行操作
//创建一个集合,并装上数据
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Observable.just(integers)
.subscribe(new Action1<List<Integer>>() {
@Override
public void call(List<Integer> integers) {
System.out.println(integers);
}
});
RxAndroid接收一个集合对象,对其中数据进行过滤
//创建一个集合,并装上数据
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Observable.from(integers)
//对集合数据进行过滤,只发送符合条件的事件
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
//只要符合的条件就行,可以是偶数什么的
return integer < 4;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext : " + integer);
}
});
//RxAndroid接收一个集合对象,对其中数据进行转换
//创建一个集合,并装上数据
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Observable.from(integers)
//提示:可以把流转换成bitmap,文件,String...
.map(new Func1<Integer, String>() {
@Override
public String call(Integer integer) {
return integer.toString();
}
})
.subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
把拿到的集合,进行拆分观察
//创建一个集合,并装上数据
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> integers1 = Arrays.asList(6, 7, 8);
List<Integer> integers2 = Arrays.asList(9, 10);
Observable.just(integers,integers1,integers2)
.flatMap(new Func1<List<Integer>, Observable<?>>() {
@Override
public Observable<?> call(List<Integer> integers) {
return Observable.from(integers);
}
})
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
System.out.println(o);
}
});
******************************下面的东西重要了,实现异步
使用RxAndroid做线程间的通讯,线程调度器
//注意:这里用到了SD卡,记得加一下权限
Observable.just(Environment.getExternalStorageDirectory().getAbsolutePath() + "/1.jpg")
//加载的是字符串,转换为Bitmp对象
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
String name = Thread.currentThread().getName();
System.out.println("Func1的call所在线程名称 : " + name);
Bitmap bitmap = BitmapFactory.decodeFile(s);
return bitmap;
}
})
//IO:线程名称RxIoScheduler-2(子线程,内部用到了一个线程池)
.subscribeOn(Schedulers.io())//可以执行多次,对不同数据,在不同的线程中调用
//该方法决定了 Action1的call方法(观察者执行逻辑)运行在哪个线程 mainThread:主线程
.observeOn(AndroidSchedulers.mainThread())//只能执行一次,多次调用,以第一次为基准
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
//打印线程所在名称
String Threadname = Thread.currentThread().getName();
System.out.println("Action1的call所在线程名称 : " + Threadname);
ImageView.setImageBitmap(bitmap);
}
});
*************************************扩展点小知识,关于用户狂点button按钮问题
1.创建类
//被监听
class MyOnSubscribe implements Observable.OnSubscribe<View>{
public MyOnSubscribe(View view) {
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("我被狂点中...");
mSubscriber.onNext(v);
}
});
}
private Subscriber mSubscriber;
@Override
public void call(Subscriber<? super View> subscriber) {
mSubscriber = subscriber ;
}
}
//创建被被观察者
Observable.create(new MyOnSubscribe(button))
//设置时间
.throttleFirst(10,TimeUnit.SECONDS)
.subscribe(new Action1<View>() {
@Override
public void call(View view) {
System.out.println("我在call方法中,我被点击了,有反应了");
}
});