Rxjava响应式编程

一、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():决定下游事件被处理时所处的线程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值