java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络

Retrofit和Okhttp和RxJava的封装

导入依赖

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

compile 'io.reactivex.rxjava2:rxjava:2.1.7'

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

compile 'com.squareup.retrofit2:converter-scalars:2.0.0'

compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'

compile 'com.google.code.gson:gson:2.8.2'

compile 'com.squareup.okhttp3:okhttp:3.9.0'加入权限

先写几个公共的封装类

retrofit的封装类

public class RetrofitUtils {

private static IGetService service = null;

//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10

//单例模式

public static IGetService getInstance(){

if(service==null){

synchronized (RetrofitUtils.class){

if(service==null){

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://api.tianapi.com")

.addConverterFactory(ScalarsConverterFactory.create())

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.client(OkHttpUtils.getInstance())

.build();

service = retrofit.create(IGetService.class);

}

}

}

return service;

}

}okhttp的封装类

public class OkHttpUtils {

private static OkHttpClient client = null;

public static OkHttpClient getInstance(){

if(client==null){

synchronized (OkHttpUtils.class){

if(client==null){

client = new OkHttpClient.Builder()

.connectTimeout(2000, TimeUnit.SECONDS)

.writeTimeout(2000,TimeUnit.SECONDS)

.readTimeout(2000,TimeUnit.SECONDS)

.addInterceptor(new LoggingInterceptor())

.addInterceptor(new CommonHeaderInterceptor())

.build();

}

}

}

return client;

}

}

LoggingInterceptor日志拦截器的封装

public class LoggingInterceptor implements Interceptor{

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

long t1 = System.nanoTime();

Response response = chain.proceed(request);

long t2 = System.nanoTime();

System.out.println(" this request url "+response.request().url()+" "+(t2-t1)/1000000);

return response;

}

}CommonHeaderInterceptor公共的请求头拦截器

public class CommonHeaderInterceptor implements Interceptor{

@Override

public Response intercept(Chain chain) throws IOException {

Request request = chain.request();

Request.Builder builder = request.newBuilder();

builder.addHeader("key","aa");

builder.addHeader("User-Agent","android");

return chain.proceed(builder.build());

}

}观察者Observer的封装

//观察者的封装

public abstract class AbstractObserver implements Observer {

//不需要下面重写的四个方法,只需要自己写的两个抽象方法

public abstract void onSuccess(T t);

public abstract void onFailure();

@Override

public void onSubscribe(Disposable d) {

}

@Override

public void onNext(String result) {

//这里的s是请求网络传回来的string字符串

Type type = getClass().getGenericSuperclass();

Type[] types = ((ParameterizedType) type).getActualTypeArguments();

Class clazz = (Class) types[0];//强转成类对象

//使用gson解析

Gson gson = new Gson();

T t = (T) gson.fromJson(result,clazz);

//调用抽象方法onSuccess

onSuccess(t);

}

@Override

public void onError(Throwable e) {

onFailure();

}

@Override

public void onComplete() {

}

}Retrofit的接口

public interface IGetService {

/* @GET("/nba")

Observable get(@QueryMap Map map);*/

//-----------------------下面用于封装的请求

//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10

//返回string字符串的请求方法,传后面整个url

@GET

Observable get1(@Url String url);//重载

@GET

Observable get1(@Url String url,@QueryMap Map map);

@FormUrlEncoded

@POST

Observable post1(@Url String url, @FieldMap Map map);

@POST

Observable post1(@Url String url);

}APIFactory.java这个类里面有对应的四个方法get1, post1

public class APIFactory {

//单例模式

private static APIFactory factory = null;

public static APIFactory getInstance(){

if(factory==null){

synchronized (APIFactory.class){

if(factory==null){

factory = new APIFactory();

}

}

}

return factory;

}

//这里面写方法.

public void get1(String url, Map map, Observer observer){

//调用retrofit工具类的方法

RetrofitUtils.getInstance().get1(url, map)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(observer);

}

public void get1(String url,Observer observer){

RetrofitUtils.getInstance().get1(url)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(observer);

}

public void post1(String url,Map map,Observer observer){

RetrofitUtils.getInstance().post1(url,map)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(observer);

}

public void post1(String url,Observer observer){

RetrofitUtils.getInstance().post1(url)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(observer);

}

}在model层里面调用APIFactory里面的4个方法get1,post1,

//具体的model层

public class LoginModelImpl {

//model层处理数据,请求网络

public void getData(final LoginModelCallBack loginModelCallBack) {

//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10

Map map = new HashMap<>();

map.put("key","71e58b5b2f930eaf1f937407acde08fe");

map.put("num","10");

/* Retrofit retrofit = new Retrofit.Builder()

.baseUrl("http://api.tianapi.com")

.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

.addConverterFactory(GsonConverterFactory.create())

.build();

IGetService service = retrofit.create(IGetService.class);

service.get(map).subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Consumer() {

@Override

public void accept(Bean bean) throws Exception {

loginModelCallBack.success(bean);

}

});*/

//------------

//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10

//调用apifactory

//传参map集合

APIFactory.getInstance().get1("/nba", map, new AbstractObserver() {

@Override

public void onSuccess(Bean bean) {

// System.out.println("beanget传参 ="+bean.getNewslist().toString());

}

@Override

public void onFailure() {

// System.out.println("异常了");

}

});

//不传参,直接传路径

APIFactory.getInstance().get1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver() {

@Override

public void onSuccess(Bean bean) {

// System.out.println("beanget不传参 ="+bean.getNewslist().toString());

}

@Override

public void onFailure() {

// System.out.println("异常了");

}

});

//不传参直接传路径post

APIFactory.getInstance().post1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver() {

@Override

public void onSuccess(Bean bean) {

System.out.println("beanpost不带参数 ="+bean.getNewslist().toString());

loginModelCallBack.success(bean);

}

@Override

public void onFailure() {

System.out.println("异常了");

}

});

/* //传参 post路径,不好使

APIFactory.getInstance().post1("/nba", map, new AbstractObserver() {

@Override

public void onSuccess(Bean bean) {

System.out.println("beanpost带参数 ="+bean.getNewslist().toString());

}

@Override

public void onFailure() {

System.out.println("异常了");

}

});*/

}

}

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

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

相关文章

【渝粤题库】陕西师范大学200671 电子技术基础

《电子技术基础》作业 一&#xff0e;电路如图所示&#xff1a; 请计算该电路的静态工作点Q&#xff1b; 请画出该电路的微变等效电路图&#xff1b; 请计算该电路的输入电阻Ri;输出电阻Ro; 二&#xff0e;电路如图所示&#xff0c;试判断&#xff1a; 1.该电路的反馈类型&…

【渝粤题库】陕西师范大学202051公共财政学作业(高起专)

《公共财政学》作业 一、填空题&#xff1a; &#xff11;&#xff0e;财政的基本职能是____________职能&#xff0c;职能&#xff0c;___________职能。 &#xff12;&#xff0e;按财政收入形式分类&#xff0c;是财政收入的主要来源。 &#xff13;&#xff0e;我国现行个人…

java空类型方法无参_类的无参方法

一.JavaDoc注释语法&#xff1a;/***author Flc*/author 标明开发该类模块的作者version 标明该类模块的版本see 参考转向&#xff0c;也就是相关主题param 对方法中某参数的说明return 对方法返回值的说明exception 对方法可能抛出的异常进行说明author 作者名version 版本号其…

jboss5.1安全性配置_使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全

jboss5.1安全性配置企业应用程序的一个常见要求是在登录页面后面保护所有JSF页面。 有时&#xff0c;您甚至希望在应用程序内部具有保护区&#xff0c;只有拥有特定角色的用户才能访问这些保护区。 Java EE标准附带了实现受某些安全性约束保护的Web应用程序所需的所有方法。 在…

java comparator相等_详解Java中Comparable和Comparator接口的区别

详解Java中Comparable和Comparator接口的区别发布于 2020-7-20|复制链接摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别&#xff0c;两者都有比较的功能&#xff0c;那么究竟有什么区别呢&#xff0c;感兴趣的J…

Java 11:运行单文件程序和“ shebang”脚本

在Java 11中&#xff0c;对java启动器进行了增强&#xff0c;使其可以直接运行单文件源代码程序&#xff0c;而不必先对其进行编译。 例如&#xff0c;考虑以下仅添加其参数的类&#xff1a; import java.util.*; public class Add {public static void main(String[] args) …

update core.php 更新_PHP: 更新日志 - Manual

8.0.0The format character p has been added.Prior to this version, false was returned on failure.Prior to this version, false was returned on failure.These functions no longer return false on failure.callback 回调现在可以为空(nullable)。scale is now nullabl…

分布式事务 camel_使用Camel在Amazon上构建分布式工作流应用程序

分布式事务 camel带有SNS-SQS的管道 工作流由以动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程&#xff0c;例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了用于构建分布式和可伸缩工作流应用程序的各种工具。 构建此类应用程序的一种方法…

php登陆框_PHP 登录完成跳转上一访问页面

需求描述&#xff1a;访问网站页面时&#xff0c;有的页面需要授权才能访问&#xff0c;这时候就会要求用户登录&#xff0c;跳转到登录页面login.php&#xff0c;怎么实现登录后返回到刚才访问的页面。解决思路1&#xff1a;在跳转到登录页面之前要将当前访问页面的url保存到c…

比较Java REST文档框架

确定在记录REST API时选择哪种Java框架可能很麻烦。 在本博文中&#xff0c;我们将简要比较我们自己使用的REST Web服务的三种文档框架&#xff0c;以及它们如何与Spring框架&#xff08;这是Foreach最常使用的Java框架&#xff09;集成。 这些是RESTful API建模语言&#xff0…

php 获取文件最后几行,php获取文件的最后N行数据

本篇文章介绍的内容是php获取文件的最后N行数据&#xff0c;现在分享给大家&#xff0c;也可以给有需要的朋友一个参考GitHub源码代码是基于以下问题&#xff0c;给出的解决方案&#xff1a;用php写一个函数&#xff0c;获取一个文本文件最后$n行内容&#xff0c;要求尽可能效率…

jaVa游戏三国志英杰传,《三国志英杰传》到底是怎样的一款游戏

原标题&#xff1a;《三国志英杰传》到底是怎样的一款游戏介绍作为PC平台上经典的战棋策略类游戏&#xff0c;英杰传系列可谓把这一类型游戏在战略性和资源获取上的精髓发挥的淋漓尽致。系列初代的《三国志英杰传》诞生在1995年的DOS系统上&#xff0c;虽然我接触英杰传时已经是…

jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

jvm 内存镜像开发人员&#xff1a;Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面&#xff0c;它使我们使用的库可以与我们的代码进行交互&#xff0c;而无需对其进行硬…

【渝粤题库】广东开放大学 微信平台开发与应用 形成性考核 (2)

选择题 题目&#xff1a; 以下哪些功能是属于微信的&#xff1f; 题目&#xff1a; 认证过的订阅号的底部是否可以直接链接到外部链接&#xff1f; 题目&#xff1a; 下面哪些属于页面前端开发技术&#xff1f; 题目&#xff1a; 那种情况下的公众号可以申请微信支付&#xff1…

php微信小程序获取用户信息,微信小程序获取openid及用户信息的方法

本文主要介绍微信小程序如何获取openid及用户信息&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下&#xff0c;希望能帮助到大家。1. 获取openid1.1 获取code调用接口获取登录凭证(code)进而换取用户登录态信息&#xff0c;包括用户的唯一标识(openid…

【渝粤题库】广东开放大学 服务标准化 形成性考核

​&#x1f449;关注我,看答案&#x1f448; 选择题 题目&#xff1a;以下关于本课程终考的描述正确的是&#xff1f; 题目&#xff1a;以下哪种方式能判断已发布的形考是否都做了&#xff1f; 题目&#xff1a;作为专业方向课&#xff0c;本课程最后的总成绩应该达到多少才不影…

谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!

有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物&#xff1f; 有20亿个孩子&#xff0c;每个孩子都有自己的愿望清单&#xff0c;他会在24小时内完成。 这意味着每个孩子平均需要43微秒&#xff0c;他需要检查每个孩子是否顽皮或好。 您无需再怀疑了。 我会透露这个秘密…

php时间格式函数,PHP函数之日期时间函数date()使用详解_php基础_脚本

$ttime();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日&#xff0c;二位数字&#xff0c;若不足二位则前面补零; 如: "01" 至 "31"D - 星期几…

【渝粤题库】广东开放大学 物业财税管理基础 形成性考核

选择题 题目&#xff1a;企业将资金以购买债券、提供借款或商业信用等形式出借给其他单位&#xff0c;这是一种&#xff08; &#xff09;的财务关系。 题目&#xff1a;&#xff08; &#xff09;是指买卖双方成交后&#xff0c;在双方约定的未来某一特定的时日才交割的交易市…

【渝粤题库】广东开放大学 统计基础 形成性考核

选择题 题目&#xff1a; 对某城市工业企业未安装设备进行普查&#xff0c;总体单位是&#xff08; &#xff09;。 选择一项&#xff1a; 题目&#xff1a; 某地"国内生产总值”这一统计指标属于&#xff08; &#xff09;。 选择一项&#xff1a; 题目&…