一、Rxjava的思维
(1)响应式编程 (根据上一层的响应来影响下一层的变化) Rx全称:reactivex
链式编程:起点-需求1-需求2-......-终点
eg:登录操作: 触发登录按钮(起点)------第一步登录--------第二步登录------第三步登录--------登录跳转至主页面(终点)
中间三步登录即为需求
(2)具体思维代码:
只看起点和终点:obsevrable被观察者为起点、subscribe订阅为关联起点和终点
Observable.just(Path)
? ? ? //关联:观察者设计模式 关联起点和终点=订阅
? ? ? .subscribe(new Observer<Bitmap>() {
? ? ? ? ? //订阅成功
? ? ? ? ? @Override
? ? ? ? ? public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
? ? ? ? ? ? ? pg.show("正在加载中"); //终点进程的第一步
?
? ? ? ? ? }
? ? ? ? ? //上一层给我的响应
? ? ? ? ? @Override
? ? ? ? ? public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap bitmap) {
? ? ? ? ? ? ? binding.iv.setImageBitmap(bitmap); //响应后显示图片
?
? ? ? ? ? }
? ? ? ? ? //链条思维发生异常
?
? ? ? ? ? @Override
? ? ? ? ? public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
?
? ? ? ? ? }
? ? ? ? ? //整个链条全部结束
? ? ? ? ? @Override
? ? ? ? ? public void onComplete() {
? ? ? ? ? ? ? if(pg!=null){
? ? ? ? ? ? ? ? ? pg.dismiss(); //隐藏进度条
? ? ? ? ? ? ? }
?
? ? ? ? ? }
? ? ? });
如果中间添加了三个需求:
Observable.just(Path)
? ? ? //需求1:图片下载需求将string转成bitmap
? ? ? .map(new Function<String, Bitmap>() {
? ? ? ? ? @Override
? ? ? ? ? public Bitmap apply(String path) throws Throwable {
? ? ? ? ? ? ? try{
? ? ? ? ? ? ? ? ? Thread.sleep(2000);
? ? ? ? ? ? ? ? ? //请求服务器响应数据
? ? ? ? ? ? ? ? ? URL url=new URL(path);
? ? ? ? ? ? ? ? ? HttpURLConnection httpURLConnection= (HttpURLConnection) url.openConnection();
? ? ? ? ? ? ? ? ? httpURLConnection.setConnectTimeout(5000); //设置请求最短时间
? ? ? ? ? ? ? ? ? int responseCode=httpURLConnection.getResponseCode(); //得到响应码
? ? ? ? ? ? ? ? ? if(responseCode==HttpURLConnection.HTTP_OK){
? ? ? ? ? ? ? ? ? ? ? InputStream inputStream=httpURLConnection.getInputStream();
? ? ? ? ? ? ? ? ? ? Bitmap bitmap=BitmapFactory.decodeStream(inputStream);
? ? ? ? ? ? ? ? ? ? return bitmap; //将此时的bitmap传至下一层
?
? ? ? ? ? ? ? ? ? }
?
? ? ? ? ? ? ? }catch (Exception e){
? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? }
? ? ? ? ? ? ? return null;
? ? ? ? ? }
? ? ? })
?
? ? ? //需求2:加水印
? ? ? .map(new Function<Bitmap, Bitmap>() {
? ? ? ? ? @Override
? ? ? ? ? public Bitmap apply(Bitmap bitmap) throws Throwable {
? ? ? ? ? ? ? Paint paint=new Paint(); //画布
? ? ? ? ? ? ? paint.setColor(Color.BLUE);
? ? ? ? ? ? ? paint.setTextSize(88); ? // 字的大小
? ? ? ? ? ? ? Bitmap shuiyingbitmap=drawTextToBitmap(bitmap,"好的",paint,88,88);
? ? ? ? ? ? ? return shuiyingbitmap; //将此时加水印的bitmap传至下一层
? ? ? ? ? }
? ? ? })
? ? ? ?
? ? ? //需求3:日志打印需求
? ? ? .map(new Function<Bitmap, Bitmap>() {
? ? ? ? ? @Override
? ? ? ? ? public Bitmap apply(Bitmap bitmap) throws Throwable {
? ? ? ? ? ? ? Log.e("tag","什么时候下载了图片apply"+System.currentTimeMillis());
? ? ? ? ? ? ? return bitmap; ? //此时的bitmap没有做任何改变
? ? ? ? ? }
? ? ? })
? ? ? ?
? ? ? //给上面的线程分配异步线程
? ? ? .subscribeOn(Schedulers.io())
? ? ? ?
? ? ? //终点分配Android主线程
? ? ? .observeOn(AndroidSchedulers.mainThread())
? ? ? ?
? ? ? //关联:观察者设计模式 关联起点和终点=订阅
? ? ? .subscribe(new Observer<Bitmap>() {
? ? ? ? ? //订阅成功
? ? ? ? ? @Override
? ? ? ? ? public void onSubscribe(@io.reactivex.rxjava3.annotations.NonNull Disposable d) {
? ? ? ? ? ? ? pg.show("正在加载中"); //终点进程的第一步
?
? ? ? ? ? }
? ? ? ? ? //上一层给我的响应
? ? ? ? ? @Override
? ? ? ? ? public void onNext(@io.reactivex.rxjava3.annotations.NonNull Bitmap bitmap) {
? ? ? ? ? ? ? binding.iv.setImageBitmap(bitmap); //响应后显示图片
?
? ? ? ? ? }
? ? ? ? ? //链条思维发生异常
?
? ? ? ? ? @Override
? ? ? ? ? public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
?
? ? ? ? ? }
? ? ? ? ? //整个链条全部结束
? ? ? ? ? @Override
? ? ? ? ? public void onComplete() {
? ? ? ? ? ? ? if(pg!=null){
? ? ? ? ? ? ? ? ? pg.dismiss(); //隐藏进度条
? ? ? ? ? ? ? }
?
? ? ? ? ? }
? ? ? });
二、订阅及主要的操作符
(1)subscribe中observe和custom的区别:
observe中有四个方法:onSubscribe、onNext、 onError、onComplete()
custom中只有一个方法:accept()对应的observe中的onNext()方法
Observable.fromArray(strings)
? ? ? //订阅起点终点
.subscribe(new Consumer<String>() {
? @Override
? //终点
? public void accept(String s) throws Throwable {
? ? ? Log.d("tag","accept:"+s); //打印输出数组
? }
});
(2)主要的操作符
1.创建操作符 create、just 主要是创建observeable
2.转换操作符 map、flatmap 主要是对发射的事件进行再处理,比如上面的增加需求用map操作符
3.组合操作符:concat、concatArray 主要就是将多个被观察者集合成一个呗观察者
4.功能操作符:subscribeOn():决定产生事件发射的线程、observeOn():决定下游事件被处理时所处的线程
|