IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Rxjava响应式编程 -> 正文阅读

[移动开发]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():决定下游事件被处理时所处的线程

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:47:32  更:2021-12-16 17:49:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:14:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码