还是先来一个简单的demo,里面的泛型string即是返回的数据类型
final List<String> allData = new ArrayList();
allData.add("123");
allData.add("456");
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
for (String s : allData) {
e.onNext(s);
}
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
if (s.equals("123")) {
Log.e("收到123", "======");
} else {
Log.e("收到456", "======");
}
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
第二个demo
private void showImage(String imageUrl) {
Observable.create(new ObservableOnSubscribe<Bitmap>() {
@Override
public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Bitmap> e) throws Exception {
e.onNext(BitmapFactory.decodeResource(getResources(), R.drawable.shoucang));
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Bitmap>() {
@Override
public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
}
@Override
public void onNext(@io.reactivex.annotations.NonNull Bitmap s) {
jcVideoPlayerStandard.thumbImageView.setImageBitmap(s);
}
@Override
public void onError(@io.reactivex.annotations.NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
概述:被观察者-Observable;观察者-Observer/Subcriber;建立订阅关系-Observable.subscribe(Observer/Subcriber) 注:在rx2.0版本Subscriber将不能使用该方法建立订阅关系;线程-Scheduler. RxJava遵循线程不变的规则,在哪个线程产生的事件就在哪个线程消费该事件。
1.简单使用例子,在activity中根据传入的string来显示button的内容
创建被观察者(数据的传入变化):有多种创建方法,列举如下三种
//创建被观察者,使用基本方法oncreat()
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
e.onNext("stop");
e.onNext("start");
e.onComplete();
}
});
第二种:
//创建被观察者-使用just方法,直接把需要传入的参数写入
Observable observable1 = Observable.just("start", "stop");
//创建被观察者-使用from方法
String[] strings = {"start", "stop"};
Observable observable2 = Observable.fromArray(strings);
2.观察者的创建,以及与被观察者之间建立订阅关系
//创建观察者(因数据传入的不同而进行不同的操作):
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
//这里的disposable可以用来解除订阅
}
@Override
public void onNext(@NonNull String o) {
Log.e("收到数据", o);
if (o.equals("stop")) {
Log.e("进入到判断证", "===");
textView.setText("收到消息");
}
if (o.equals("start")) {
textView1.setText("收到start");
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("onError", "发生错误");
}
@Override
public void onComplete() {
Log.e("onComplete", "事件调用完成");
}
};
//建立订阅关系
observable2.subscribe(observer);
3.刚才的demo是一个均在主线程进行操作的例子,但是rxjava主要的特点是异步,在代码中的体现就是可以选择观察者和被观察者处理所在的线程;已知线程如下:
线程类:Scheduler
Schedulers.immediate():直接在当前线程运行,相当于不指定线程。这是默认的 Scheduler。
Schedulers.newThread():总是启用新线程,并在新线程执行操作。
Schedulers.io():I / O 操作(读写文件、读写数据库、网络信息交互等)所使用的 Scheduler。行为模式和 newThread () 差不多,区别在于 io ()
的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io () 比 newThread () 更有效率。不要把计算工作放在 io () 中,
可以避免创建不必要的线程。
Schedulers.computation():计算所使用的 Scheduler。这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。
这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。不要把 I/O 操作放在 computation() 中,否则 I/O 操作的等待时间会浪费 CPU。
Android 专用 AndroidSchedulers.mainThread(),它指定的操作将在 Android 主线程运行。
有了这几个 Scheduler ,就可以使用 subscribeOn () 和 observeOn () 两个方法来对线程进行控制了。
subscribeOn():
指定 subscribe () 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程,或者叫做事件产生的线程。
observeOn():
指定 Subscriber 所运行在的线程,事件消费的线程。
4.关于事件处理以及事件消费所在线程的切换demo
一个读取图片的例子,一种在主线程读取,一种在子线程读取:子线程:
public class MyAxTest extends Activity {
List<String> allImage;
/*
* 被观察者
* */
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
// List<Bitmap> allBitmap=getBitmapByRes(allImage);
Bitmap bitmap = getOneBitmapByRes("a1");
e.onNext(bitmap);
e.onComplete();
}
}).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io());
//.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io())
/*
* 观察者者
* */
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
Bitmap allBitmap = (Bitmap) o;
Log.e("收到的数据", allBitmap.toString() + "");
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
Log.e("完成", "===");
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("系统时间", System.currentTimeMillis() + "");
observable.subscribe(observer);
Log.e("系统时间1", System.currentTimeMillis() + "");
Toast.makeText(getApplicationContext(), "===", Toast.LENGTH_SHORT).show();
Log.e("系统时间2", System.currentTimeMillis() + "");
allImage = new ArrayList<>();
allImage.add("a1");
allImage.add("a2");
allImage.add("a3");
allImage.add("a4");
allImage.add("a5");
}
/*
* 根据图片的id查找图片
* */
private Bitmap getOneBitmapByRes(String path) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
if (path.equals("a1")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1, options);
} else if (path.equals("a2")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2, options);
} else if (path.equals("a3")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3, options);
} else if (path.equals("a4")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4, options);
} else {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a5, options);
}
return bitmap;
}
}
根据logcat输出可以看到,没有阻塞主线程。
主线程:
public class MyAxTest extends Activity {
List<String> allImage;
/*
* 被观察者
* */
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
// List<Bitmap> allBitmap=getBitmapByRes(allImage);
Bitmap bitmap = getOneBitmapByRes("a1");
e.onNext(bitmap);
e.onComplete();
}
});
//.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io())
/*
* 观察者者
* */
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
Bitmap allBitmap = (Bitmap) o;
Log.e("收到的数据", allBitmap.toString() + "");
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
Log.e("完成", "===");
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("系统时间", System.currentTimeMillis() + "");
observable.subscribe(observer);
Log.e("系统时间1", System.currentTimeMillis() + "");
Toast.makeText(getApplicationContext(), "===", Toast.LENGTH_SHORT).show();
Log.e("系统时间2", System.currentTimeMillis() + "");
allImage = new ArrayList<>();
allImage.add("a1");
allImage.add("a2");
allImage.add("a3");
allImage.add("a4");
allImage.add("a5");
}
/*
* 根据图片的id查找图片
* */
private Bitmap getOneBitmapByRes(String path) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
if (path.equals("a1")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a1, options);
} else if (path.equals("a2")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a2, options);
} else if (path.equals("a3")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a3, options);
} else if (path.equals("a4")) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a4, options);
} else {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a5, options);
}
return bitmap;
}
logcat输出:可以看到主线程已经被阻塞
5.实现一个定时器---直接在主线程做处理
//每隔两秒调用一次onNext();
Observable observable=Observable.interval(2, TimeUnit.SECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
;
Observer observer=new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
Log.e("数据传输过来","数据传输");
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribe(observer);
定时任务-某些不能直接在主线程做的任务--引入map
/*
* 实现一个定时输出--模拟耗时任务
* */
private void timeOutPut(){
//每隔两秒调用一次onNext();
Observable<Bitmap> observable=Observable.interval(2, TimeUnit.SECONDS).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
.map(new Function<Long, Bitmap>() {
@Override
public Bitmap apply(@NonNull Long aLong) throws Exception {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
options.inJustDecodeBounds = false;
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.a1,options);
return bitmap;
}
})
;
Observer observer=new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
Log.e("数据传输过来","数据传输");
imageView.setImageBitmap((Bitmap) o);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribe(observer);
}
6.计数(伪)
//以某个固定时间间隔按照增续调用onNext()方法,如这里会输出0-59;但是,如果写作60,0;将不会有操作
Observable observable = Observable.range(60, 0);
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("start", "start");
}
@Override
public void onNext(@NonNull Object o) {
Log.e("当前数值", String.valueOf((int) o));
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("异常", e.getMessage() + "=");
}
@Override
public void onComplete() {
Log.e("end", "end");
}
};
observable.subscribe(observer);
7.延时操作,类似与handle.postdenly();
/*
* 实现一个延时调用
* */
private void YanShi() {
Observable observable = Observable.timer(2, TimeUnit.SECONDS);
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Object o) {
Log.e("收到延时数据了", "==" + System.currentTimeMillis());
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribe(observer);
Log.e("开始的时间", System.currentTimeMillis() + "");
}
8.实现一个重复操作
/**
* 实现一个重复操作
*/
private void repeatDo() {
Observable observable = Observable.just("hello").repeat();
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
if (s.equals("hello")) {
Log.e("收到", "收到");
} else {
Log.e("收到其他数据", s);
}
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("出错", e.getMessage() + "=");
}
@Override
public void onComplete() {
Log.e("end", "end");
}
};
observable.subscribe(observer);
}
9.操作符map-对传入的数据进行处理
/*
* AX中操作符-map
* */
private void doOperator() {
//前面Observable后面的string表示我需要的数据类型,而ObservableOnSubscribe后面的integer表示我传入的数据类型
Observable<String> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(2);
e.onComplete();
}
}).map(new Function<Integer, String>() {
@Override
public String apply(@NonNull Integer integer) throws Exception {
if (integer == 1) {
return "OK";
} else {
return "are you ok";
}
}
});
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String integer) {
Log.e("收到的数据", integer);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
};
observable.subscribe(observer);
}
10.操作符filter,过滤作用
/*
* AX操作符-filter--过滤作用,内部的test方法返回ture表示这个传入的参数可用,会被传递到observer中,否则就丢弃
* */
private void doFlaMap() {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("1");
e.onNext("2");
e.onComplete();
}
}).filter(new Predicate<String>() {
@Override
public boolean test(@NonNull String s) throws Exception {
if (s.equals("1")) {
return true;
} else {
return false;
}
}
}).subscribe(new Subject<String>() {
@Override
public boolean hasObservers() {
return false;
}
@Override
public boolean hasThrowable() {
return false;
}
@Override
public boolean hasComplete() {
return false;
}
@Override
public Throwable getThrowable() {
return null;
}
@Override
protected void subscribeActual(Observer<? super String> observer) {
}
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.e("拿到的数据", s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
11.take操作符--限制传入的个数
/*
* AX操作符-take--限制传入observer中的数据个数,如下例子,只能输出1、2
* */
private void doTake() {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("1");
e.onNext("2");
e.onNext("3");
e.onNext("4");
}
}).take(2).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.e("收到的数据", s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
12.操作符-doOnNext--在数据传递给observer之前做一些操作,网上的一个例子:从服务器拿到数据,然后更改本地数据库,然后显示数据(这里的显示数据是从数据库拿到的,否则没意义)
/*
* 操作符-doOnNext
* */
private void doOnNext() {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
e.onNext("1");
e.onComplete();
}
}).doOnNext(new Consumer<String>() {
@Override
public void accept(@NonNull String s) throws Exception {
Log.e("第一次的数据", s);
s = "1111111111";
}
}).subscribe(new Observer<String>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Log.e("最终的数据", s);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
}
待续。。。。。。