android--RXJava+Retrofit封装使用

在欲望的城市里,你就是我最后的信仰。 

目录

前言

一,方法封装

二,okhttp+retrofit+rxjava 实现网络请求 

前言

关于RXJava的基本使用,请参考 文章android--RXJava详细使用篇-CSDN博客

下面我们讲一下RXJava在android中的相对比较高级的用法

一,方法封装

在上篇文章中,我们有个加载图片的案例:

Observable.just(IMGPATH)//发送图片地址.map(new Function<String, Bitmap>() {@Overridepublic Bitmap apply(String s) throws Exception {URL url = new URL(IMGPATH);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnectihttpURLConnection.setConnectTimeout(5000);int responseCode = httpURLConnection.getResponseCode(); // 才开始 requestif (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = httpURLConnection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;}return null;}}).map(new Function<Bitmap, Bitmap>() {@Overridepublic Bitmap apply(Bitmap bitmap) throws Exception {System.out.println("下载图片");return bitmap;}}).subscribeOn(Schedulers.io())//上面是异步.observeOn(AndroidSchedulers.mainThread())//下面是主线程.subscribe(new Observer<Bitmap>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Bitmap bitmap) {img.setImageBitmap(bitmap);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});

但是有些操作,比如线程切换,我们每次都要写重复的代码,这时我们就可以把他们封装起来:

 //创建Observable
Observable.just(IMGPATH)//发送图片地址.map(new Function<String, Bitmap>() {@Overridepublic Bitmap apply(String s) throws Exception {URL url = new URL(IMGPATH);HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();httpURLConnection.setConnectTimeout(5000);int responseCode = httpURLConnection.getResponseCode(); // 才开始 requestif (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = httpURLConnection.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(inputStream);return bitmap;}return null;}}).map(new Function<Bitmap, Bitmap>() {@Overridepublic Bitmap apply(Bitmap bitmap) throws Exception {System.out.println("下载图片");return bitmap;}}).compose(method())//公共的方法提取.subscribe(new Observer<Bitmap>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Bitmap bitmap) {img.setImageBitmap(bitmap);}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});
public  static <T> ObservableTransformer<T,T> method(){return new ObservableTransformer<T, T>() {@Overridepublic ObservableSource<T> apply(Observable<T> upstream) {return upstream.subscribeOn(Schedulers.io()) // 给上面代码分配异步线程.observeOn(AndroidSchedulers.mainThread())// 给下面代码分配主线程.map(new Function<T, T>() {@Overridepublic T apply(T t) throws Exception {return t;}}); //也可以把公共的map封装到这里}};
}

二,okhttp+retrofit+rxjava 实现网络请求 

这里列举一下两个 请求嵌套的情况下,rxjava是怎么实现的

首先创建两个数据类:

public class ProjectBean {private int errorCode;private String errorMsg;private List<DataBean> data;@Overridepublic String toString() {return "ProjectBean{" +"errorCode=" + errorCode +", errorMsg='" + errorMsg + '\'' +", data=" + data +'}';}public int getErrorCode() {return errorCode;}public void setErrorCode(int errorCode) {this.errorCode = errorCode;}public String getErrorMsg() {return errorMsg;}public void setErrorMsg(String errorMsg) {this.errorMsg = errorMsg;}public List<DataBean> getData() {return data;}public void setData(List<DataBean> data) {this.data = data;}public static class DataBean {private int courseId;private int id;private String name;private int order;private int parentChapterId;private boolean userControlSetTop;private int visible;private List<?> children;@Overridepublic String toString() {return "DataBean{" +"courseId=" + courseId +", id=" + id +", name='" + name + '\'' +", order=" + order +", parentChapterId=" + parentChapterId +", userControlSetTop=" + userControlSetTop +", visible=" + visible +", children=" + children +'}';}public int getCourseId() {return courseId;}public void setCourseId(int courseId) {this.courseId = courseId;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getOrder() {return order;}public void setOrder(int order) {this.order = order;}public int getParentChapterId() {return parentChapterId;}public void setParentChapterId(int parentChapterId) {this.parentChapterId = parentChapterId;}public boolean isUserControlSetTop() {return userControlSetTop;}public void setUserControlSetTop(boolean userControlSetTop) {this.userControlSetTop = userControlSetTop;}public int getVisible() {return visible;}public void setVisible(int visible) {this.visible = visible;}public List<?> getChildren() {return children;}public void setChildren(List<?> children) {this.children = children;}}
}
public class ProjectItem {private DataBean data;private int errorCode;private String errorMsg;public static class DataBean {private int curPage;private int offset;private boolean over;private int pageCount;private int size;private int total;private List<DatasBean> datas;public static class DatasBean {private String apkLink;private String author;private int chapterId;private String chapterName;private boolean collect;private int courseId;private String desc;private String envelopePic;private boolean fresh;private int id;private String link;private String niceDate;private String origin;private String prefix;private String projectLink;private long publishTime;private int superChapterId;private String superChapterName;private String title;private int type;private int userId;private int visible;private int zan;private List<TagsBean> tags;public static class TagsBean {private String name;private String url;}}}
}

然后创建一个Api请求接口

public interface MyApi {// 总数据@GET("project/tree/json")Observable<ProjectBean> getProject();  // 异步线程 耗时操作// Item数据@GET("project/list/{pageIndex}/json") Observable<ProjectItem> getProjectItem(@Path("pageIndex") int pageIndex, @Query("cid") int cid);  // 异步线程 耗时操作
}

创建一个工具类,获取Retrofit

public class Util {public static String BASE_URL = "https://www.wanandroid.com/";public static void setBaseUrl(String baseUrl) {BASE_URL = baseUrl;}/*** 根据各种配置创建出Retrofit** @return 返回创建好的Retrofit*/public static Retrofit getOnlineCookieRetrofit() {// OKHttp客户端OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();// 各种参数配置OkHttpClient okHttpClient = httpBuilder.addNetworkInterceptor(new StethoInterceptor()).readTimeout(10000, TimeUnit.SECONDS).connectTimeout(10000, TimeUnit.SECONDS).writeTimeout(10000, TimeUnit.SECONDS).build();return new Retrofit.Builder().baseUrl(BASE_URL)// TODO 请求用 OKhttp.client(okHttpClient)// TODO 响应RxJava// 添加一个json解析的工具.addConverterFactory(GsonConverterFactory.create(new Gson()))// 添加rxjava处理工具.addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();}
}

最后,使用rxjava解析数据

@SuppressLint("CheckResult")
private void getData() {// 注意:项目分类查询的id,通过此id再去查询(项目列表数据)Button bt_fangdou = findViewById(R.id.fangdou);RxView.clicks(bt_fangdou).throttleFirst(2000, TimeUnit.MILLISECONDS) // 2秒钟之内 响应一次//  切换 异步.observeOn(Schedulers.io()).flatMap(new Function<Object, ObservableSource<ProjectBean>>() {@Overridepublic ObservableSource<ProjectBean> apply(Object o) throws Exception {return api.getProject(); // 主数据}}).flatMap(new Function<ProjectBean, ObservableSource<ProjectBean.DataBean>>() {@Overridepublic ObservableSource<ProjectBean.DataBean> apply(ProjectBean projectBean) throws Exception {return Observable.fromIterable(projectBean.getData()); //可以分发多次}}).flatMap(new Function<ProjectBean.DataBean, ObservableSource<ProjectItem>>() {@Overridepublic ObservableSource<ProjectItem> apply(ProjectBean.DataBean dataBean) throws Exception {return api.getProjectItem(1, dataBean.getId());}}).observeOn(AndroidSchedulers.mainThread()) // 切换 主线程.subscribe(new Consumer<ProjectItem>() {@Overridepublic void accept(ProjectItem projectItem) throws Exception {System.out.println("更新 ui")}});
}

通过使用flatMap就避免了多层嵌套的情况,flatMap和throttleFirst上篇文章已经讲过了,这里就不再多说了,主要是使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

AIGC专题:生成式AI(GenAI)赋能供应链之路

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题&#xff1a;生成式AI&#xff08;GenAI&#xff09;赋能供应链之路》。 &#xff08;报告出品方&#xff1a;Gartner&#xff09; 报告共计&#xff1a;46页 什么是生成式人工智能 ChatGPT&#xff1a;一种OpenAI服…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”&#xff0c;这就是ABC输入法&#xff0c;点击上面的Delete按钮&#xff0c;删除整项ABC内容&#xff0c…

MySQL表的基本操作

目录 一、创建表的语法 二、表的物理存储类型 三、数据类型 3.1 文本类型类型&#xff1a; 3.2 数字类型&#xff1a; 3.3 时间\日期类型&#xff1a; 常用数据类型&#xff1a; 四、查看表 五、删除表 六、修改表的结构 八、数据库字典 九、表的约束 9.1 五类完整…

Unity 常见的图像压缩格式优缺点

在Unity中&#xff0c;将图像压缩至更小的大小&#xff0c;既可以加快加载速度&#xff0c;也可以减少内存的占用。根据不同的目标平台&#xff0c;Unity提供了以下几种常见的图像压缩格式&#xff1a; 1. RGBA Compressed: 是一种通过压缩的方式来存储RGBA&#xff08;红色、…

中国的茶文化:现代生活中的茶文化

中国的茶文化&#xff1a;现代生活中的茶文化 引言 在现代社会的快节奏生活中&#xff0c;茶文化并未随时间流逝而褪色&#xff0c;反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴&#xff0c;成为一种连接历史、人文与现代生活方式的艺术形式。本文…

Python算法题集_滑动窗口最大值

本文为Python算法题集之一的代码示例 题目239&#xff1a;滑动窗口最大值 说明&#xff1a;给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(一)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现&#xff0c;还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

【Python基础知识】(19)三种内置生成式

文章目录 一、列表生成式二 、字典生成式三、集合生成式 一、列表生成式 # 1. 列表生成式&#xff0c;语法&#xff1a;[被追加的数据 循环语句 循环或者判断语句] lst2 [i * 10 for i in range(10, 20)] print(lst2) # 输出&#xff1a;[100, 110, 120, 130, 140, 150, 160…

Python中类的相关术语(附带案例)

目录 1、面向对象 2、类 3、实例 4、初始化方法 5、魔法方法 6、字符串方法 7、self 8、数据、属性、操作、行为 9、父类、基类、超类 or 子类、派生类 10、多态 11、重载多态 and 重写多态 12、名称解释 1、面向对象 在Python中&#xff0c;面向对象编程&…

Qt关于qss文件的添加使用

把ui设计得更加的养眼&#xff0c;肯定需要对控件的属性进行设置&#xff0c;qt中就是关于qss文件的使用。 那么如何创建和添加qss文件呢 1.新建一个文本文件的txt 2.将文本文件的后缀改为qss&#xff08;类比html&#xff09; 3.放置到项目的资源文件夹下 4.添加资源文件 5.在…

代码随想录算法训练营第二二天| 二叉搜索树的最近公共祖先、二叉搜索树中的插入操作、删除二叉搜索树中的节点

目录 二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点普通二叉树的删除方式 LeetCode 235. 二叉搜索树的最近公共祖先 LeetCode 701.二叉搜索树中的插入操作 LeetCode 450.删除二叉搜索树中的节点 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到…

windows安装oracle之后怎么连接使用

目录 1.打开SQl Developer 2.选择JDK 3.登录 4.创建表空间,用户 安装oracle的详细教程 WINDOWS安装Oracle11.2.0.4-CSDN博客 1.打开SQl Developer 找到 SQl Developer 2.选择JDK 根据你安装的oracle版本,因为我的oracle是安装的32位的,所以这里jdk也要选择32位 选择到ja…

1.迭代与递归 - JS

迭代与递归是函数进阶的第一个门槛。迭代就是对已知变量反复赋值变换&#xff1b;递归就是函数体内调用自身。 迭代 一个迭代是就是一个循环&#xff0c;根据迭代式对变量反复赋值。 求近似根&#xff08;切线法&#xff09;&#xff1b; 迭代描述&#xff1a; x 0 x_0 x0…

Docker核心教程

1. 概述 官网&#xff1a;https://docs.docker.com/ Docker Hub 网站&#xff1a;https://hub.docker.com/ 容器较为官方的解释&#xff1a; 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立…

Threejs API——`OrbitControls`相机控件

文章目录 API用法API OrbitControls 相机控制用法 导入import {OrbitControls } from three/examples/jsm/controls/OrbitControls.js import {DRACOLoader,AmbientLight,Color,MOUSE,

Java项目要不要部署在Docker里?

部署Java项目有很多种方式&#xff0c;传统的方式是直接在物理机或虚拟机上部署应用&#xff0c;但为什么现在容器化部署变得越来越流行&#xff0c; 个人觉得原因有以下几个&#xff1a; 1、 环境一致性&#xff1a;使用Docker可以确保开发、测试和生产环境的一致性&#xff…

传感器类总结(一)MPU9250 3-2程序关于IIC的底层程序

关于IIC的逻辑和底层协议可以看之前总结的 #IIC 通信协议 1、读写数据 1.1、写数据 发送N个字节程序的流程: 1、发送起始信号 2、发送从机地址和写 3、等待从机发回应答信号 4、发送第一字节数据 等待应答 5、发送下一字节数据 等带应答或非应答信号 6、发送停止信号停止发送…

D365:Debug

文章目录 前言一、附加进程二、选择进程三、DebugDebug进ApplicationSuite文件方法一方法二 前言 使用 Visual Studio 调试 D365 一、附加进程 点击路径 Debug > Attach to Process 二、选择进程 勾选下面的Show processes from all users,选择w3wp.exe&#xff0c;点击At…

#nlp|jieba分词词性对照

jieba词性对照表 a 形容词 ad 副形词 ag 形容词性语素 an 名形词 b 区别词 c 连词 d 副词 df dg 副语素 e 叹词 f 方位词 g 语素 h 前接成分 i 成语 j 简称略称 k 后接成分 l 习用语 m 数词 mg mq 数量词 n 名词 ng 名词性语素 nr 人名 nrfg nrt ns 地名 nt 机构团体名 nz 其他…