java retrofit_Android开发Retrofit2+Rxjava2+okHttp 网络框架封装
释放双眼,带上耳机,听听看~!
说明
RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道。。。
Retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,Retrofit 除了提供了传统的 Callback 形式的 API,还有 RxJava 版本的 Observable 形式 API。
自己整理资料当做笔记
一,需要添加的依赖包
compile 'io.reactivex.rxjava2:rxjava:2.0.7'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'
compile 'com.jakewharton:butterknife:8.4.0'
二、网上找了一个url练习具体是http://gank.io/api/data/福利/10/1
1.根据返回参数,封装一个基类baseresult (根据实际情况而定)
package com.example.rxjavaretrofit.base;
/**
* Created by fg on 2017/7/25.
* 解析实体基类
*/
public class BaseResult {
private static int SUCCESS_CODE=000000;//成功的code
private int code;
private String message;
private T results;
private boolean error;
public boolean isSuccess(){
return getCode()==SUCCESS_CODE;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getResults() {
return results;
}
public void setResults(T results) {
this.results = results;
}
public boolean isError() {
return error;
}
public void setError(boolean error) {
this.error = error;
}
@Override
public String toString() {
return super.toString();
}
}
2.把result内的返回数据 通过GsonFormet工具生成实体类 Bean
package com.example.rxjavaretrofit.bean;
/**
* Created by 付刚 on 2018/7/25.
*/
public class MeiZiBean {
/**
* _id : 5b50107f421aa917a31c0565
* createdAt : 2018-07-19T12:15:59.226Z
* desc : 2018-07-19
* publishedAt : 2018-07-19T00:00:00.0Z
* source : web
* type : 福利
* url : https://ww1.sinaimg.cn/large/0065oQSqly1ftf1snjrjuj30se10r1kx.jpg
* used : true
* who : lijinshanmx
*/
private String _id;
private String createdAt;
private String desc;
private String publishedAt;
private String source;
private String type;
private String url;
private boolean used;
private String who;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public boolean isUsed() {
return used;
}
public void setUsed(boolean used) {
this.used = used;
}
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
}
如果需要实现序列化进行传值 可实现Parcelable或者Serializable接口
3.接下来我们就要开始接口了哦,回到我们上面的ApiService接口模拟一个API接口getMeiZi() 可以返回得到一个observable。
package com.example.rxjavaretrofit.network;
import com.example.rxjavaretrofit.base.BaseResult;
import com.example.rxjavaretrofit.bean.MeiZiBean;
import java.util.List;
import io.reactivex.Observable;
import retrofit2.http.GET;
/**
* Created by fg on 2018/7/25.
*/
public interface ApiServise {
//网络请求超时时间 单位毫秒
int DEFAULT_TIMEOUT=20000;
String HOST = "http://gank.io/";
String API_SERVER_URL = HOST + "api/data/";
@GET("福利/10/1")
Observable>> getMeiZi();
}
4.就是对自己的Retrofit去进行封装设置
(1)retrofit是基于okhttp的加强版,所以第一步去自定义一个okhttpclient,里面设置两个拦截器,一个是日志拦截器,用于对日志的筛选,还一个就是网络拦截器,用于对网络请求头的总体设置。
package com.example.rxjavaretrofit.Utils;
import android.util.Log;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* Created by fg on 2018/7/25.
* *@description 拦截器工具类
*/
public class InterceptorUtil {
public static String TAG="----";
//日志拦截器
public static HttpLoggingInterceptor LogInterceptor(){
return new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.w(TAG, "log: "+message );
}
}).setLevel(HttpLoggingInterceptor.Level.BODY);//设置打印数据的级别
}
public static Interceptor HeaderInterceptor(){
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request mRequest=chain.request();
//在这里你可以做一些想做的事,比如token失效时,重新获取token
//或者添加header等等,PS我会在下一篇文章总写拦截token方法
return chain.proceed(mRequest);
}
};
}
}
(2)创建一个观察者基类,在其中进行对请求错误的封装和对进度条显示与消失的封装。
package com.example.rxjavaretrofit.base;
import android.accounts.NetworkErrorException;
import android.content.Context;
import com.example.rxjavaretrofit.widget.ProgressDialog;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.util.concurrent.TimeoutException;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
/**
* Created by fg on 2018/7/25.
* Observer的封装
*/
public abstract class BaseObserver implements Observer> {
protected Context mContext;
public BaseObserver(Context cxt) {
this.mContext = cxt;
}
public BaseObserver() {
}
@Override
public void onSubscribe(Disposable d) {
onRequestStart();
}
@Override
public void onNext(BaseResult tBaseEntity) {
onRequestEnd();
if (tBaseEntity.isSuccess()) {
try {
onSuccees(tBaseEntity);
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
onCodeError(tBaseEntity);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onError(Throwable e) {
// Log.w(TAG, "onError: ", );这里可以打印错误信息
onRequestEnd();
try {
if (e instanceof ConnectException
|| e instanceof TimeoutException
|| e instanceof NetworkErrorException
|| e instanceof UnknownHostException) {
onFailure(e, true);
} else {
onFailure(e, false);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
@Override
public void onComplete() {
}
/**
* 返回成功
*
* @param t
* @throws Exception
*/
protected abstract void onSuccees(BaseResult t) throws Exception;
/**
* 返回成功了,但是code错误
*
* @param t
* @throws Exception
*/
protected void onCodeError(BaseResult t) throws Exception {
}
/**
* 返回失败
*
* @param e
* @param isNetWorkError 是否是网络错误
* @throws Exception
*/
protected abstract void onFailure(Throwable e, boolean isNetWorkError) throws Exception;
protected void onRequestStart() {
}
protected void onRequestEnd() {
closeProgressDialog();
}
public void showProgressDialog() {
ProgressDialog.show(mContext, false, "请稍后");
}
public void closeProgressDialog() {
ProgressDialog.cancle();
}
}
(3)然后要创建Retrofit实例,构建一个请求的基类
package com.example.rxjavaretrofit.base;
import com.example.rxjavaretrofit.Utils.InterceptorUtil;
import com.example.rxjavaretrofit.network.ApiServise;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by fg on 2018/7/25.
*/
public class BaseRequest {
//retrofit底层用的okHttp,所以设置超时还需要okHttp
//然后设置5秒超时
//其中DEFAULT_TIMEOUT是我这边定义的一个常量
//TimeUnit为java.util.concurrent包下的时间单位
//TimeUnit.SECONDS这里为秒的单位
OkHttpClient client=new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)//设置连接超时时间
.readTimeout(20, TimeUnit.SECONDS)//设置读取超时时间
.writeTimeout(20, TimeUnit.SECONDS)//设置写入超时时间
.addInterceptor(InterceptorUtil.HeaderInterceptor())//添加其他拦截器
.addInterceptor(InterceptorUtil.LogInterceptor())//添加日志拦截器
.build();
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create()) //添加Gson转换器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加Rx转换器
.baseUrl(ApiServise.API_SERVER_URL) //baseurl
.client(client)
.build();
public ApiServise apiServise = retrofit.create(ApiServise.class);
private static BaseRequest instance;
public static synchronized BaseRequest getInstance(){
if(instance == null)
instance = new BaseRequest();
return instance;
}
public ApiServise getService() {
return apiServise;
}
}
OK这时候就可以跑通了让我们看看完整的请求 (observable(被观察者)和observer(观察者)相订阅)
public void getData() {
BaseRequest.getInstance().getService()
.getMeiZi()
.subscribeOn(Schedulers.newThread())
.subscribe(new BaseObserver>(this) {
@Override
protected void onSuccees(BaseResult> t) throws Exception {
List results = t.getResults();
Log.e("fff",results.size()+"");
}
@Override
protected void onFailure(Throwable e, boolean isNetWorkError) throws Exception {
Log.e("fff",e.toString());
}
});
}
那么到这里,封装基本上大功告成了,但是上面可以成功解析。后续数据处理就不做叙述了,
项目下载链接:https://download.csdn.net/download/fugang1230/10563945
java retrofit_Android开发Retrofit2+Rxjava2+okHttp 网络框架封装相关推荐
- Retrofit2+Rxjava2+okHttp 网络框架封装
说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把网络请求都交给给了Okhttp, ...
- 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下 ...
- MVVM+Retrofit+Kotlin网络框架封装
上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...
- iOS swift Alamofire+HandyJSON网络框架封装
iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...
- 云炬Android开发笔记 5-1,2网络框架接口创建
1.网络框架接口创建 1.1 使用的是第三方的框架 [第三方框架]Retrofit,封装一个通用的框架,可以使用RxJava和RxAndroid进行封装,比较难,这里不做讲解: 1.2 restful ...
- 初学 Java Web 开发,请远离各种框架,从 Servlet 开发
写在前面: 本文是转自:http://www.oschina.net/question/12_52027 的文章,如果要求删除,第一时间联系我立即删除! Web框架是开发者在使用某种语言编写Web应 ...
- 初学Java Web开发,请远离各种框架,从Servlet开发
[转载自红薯,原帖地址]http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类--Web框架,该分类中包含多种编程语言的将近500个项目. ...
- RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)
入职公司后,公司要求组件化开发,经过讨论后我将网络请求框架单独进行了封装,不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下,导致里面部分代码耦合,后来为了降低耦合性又将 ...
最新文章
- 最让程序员自豪的事情是什么?
- 与springcloud整合的框架源码读取入口
- oracle创建简单的包
- -webkit-overflow-scrolling与苹果
- 【机器学习】LBP+SVM实现特征检测
- 随e行安全层在与远程计算机初始化,g3随e行怎么用_g3随e行怎么安装_随e行wlan无法登陆...
- How to Visualize Your Recurrent Neural Network with Attention in Keras
- win10 linux装软件有哪些,win10若何装linux,win10安装linux双系统的详细教程,微商必备软件有哪些...
- C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)
- gin 源码解析 - 详解http请求在gin中的流转过程
- GZNT模版文件说明
- LeetCode(1122)——数组的相对排序(JavaScript)
- 语音自训练平台技术详解,快速训练专属语音识别模型
- 【Android】 使用AndServer框架在手机上搭建服务器
- 通过jdbc连接hive出现错误
- Spark REPL
- [滑模控制器浅述] (5) 基于分层滑模的吊车控制
- linux下raid1数据恢复,在linux下做RAID1试验
- matlab中SPI值,挣值管理(PV、EV、AC、SV、CV、SPI、CPI)记忆之我见
- o.s.boot.SpringApplication : Application run failed错误
热门文章
- TypeScript 学习笔记(四)--- 泛型(Generics)
- 微信公众平台开发教程第20篇-新手解惑40则
- centos7下搭建lnmp环境包含yum源直接安装和源码编译安装,以及php5.3和php7.6版本
- HDU——2546 饭卡
- 闲庭信步聊前端 - 见微知著微前端
- 基于单片机节水定时智能控制器设计-毕设课设资料
- 全网最全java Springboot对接微信公众号开发平台(可能是最全)!
- Android推送的群魔乱舞
- LVGL官方文档-7.11.0-5-Porting-Input device interface
- 软考-高项-论文-信息系统项目的进度管理