释放双眼,带上耳机,听听看~!

说明

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 网络框架封装相关推荐

  1. Retrofit2+Rxjava2+okHttp 网络框架封装

    说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把网络请求都交给给了Okhttp, ...

  2. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  3. 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

    上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下 ...

  4. MVVM+Retrofit+Kotlin网络框架封装

    上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...

  5. iOS swift Alamofire+HandyJSON网络框架封装

    iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...

  6. 云炬Android开发笔记 5-1,2网络框架接口创建

    1.网络框架接口创建 1.1 使用的是第三方的框架 [第三方框架]Retrofit,封装一个通用的框架,可以使用RxJava和RxAndroid进行封装,比较难,这里不做讲解: 1.2 restful ...

  7. 初学 Java Web 开发,请远离各种框架,从 Servlet 开发

    写在前面: 本文是转自:http://www.oschina.net/question/12_52027  的文章,如果要求删除,第一时间联系我立即删除! Web框架是开发者在使用某种语言编写Web应 ...

  8. 初学Java Web开发,请远离各种框架,从Servlet开发

    [转载自红薯,原帖地址]http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类--Web框架,该分类中包含多种编程语言的将近500个项目. ...

  9. RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)

    入职公司后,公司要求组件化开发,经过讨论后我将网络请求框架单独进行了封装,不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下,导致里面部分代码耦合,后来为了降低耦合性又将 ...

最新文章

  1. 最让程序员自豪的事情是什么?
  2. 与springcloud整合的框架源码读取入口
  3. oracle创建简单的包
  4. -webkit-overflow-scrolling与苹果
  5. 【机器学习】LBP+SVM实现特征检测
  6. 随e行安全层在与远程计算机初始化,g3随e行怎么用_g3随e行怎么安装_随e行wlan无法登陆...
  7. How to Visualize Your Recurrent Neural Network with Attention in Keras
  8. win10 linux装软件有哪些,win10若何装linux,win10安装linux双系统的详细教程,微商必备软件有哪些...
  9. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)
  10. gin 源码解析 - 详解http请求在gin中的流转过程
  11. GZNT模版文件说明
  12. LeetCode(1122)——数组的相对排序(JavaScript)
  13. 语音自训练平台技术详解,快速训练专属语音识别模型
  14. 【Android】 使用AndServer框架在手机上搭建服务器
  15. 通过jdbc连接hive出现错误
  16. Spark REPL
  17. [滑模控制器浅述] (5) 基于分层滑模的吊车控制
  18. linux下raid1数据恢复,在linux下做RAID1试验
  19. matlab中SPI值,挣值管理(PV、EV、AC、SV、CV、SPI、CPI)记忆之我见
  20. o.s.boot.SpringApplication : Application run failed错误

热门文章

  1. TypeScript 学习笔记(四)--- 泛型(Generics)
  2. 微信公众平台开发教程第20篇-新手解惑40则
  3. centos7下搭建lnmp环境包含yum源直接安装和源码编译安装,以及php5.3和php7.6版本
  4. HDU——2546 饭卡
  5. 闲庭信步聊前端 - 见微知著微前端
  6. 基于单片机节水定时智能控制器设计-毕设课设资料
  7. 全网最全java Springboot对接微信公众号开发平台(可能是最全)!
  8. Android推送的群魔乱舞
  9. LVGL官方文档-7.11.0-5-Porting-Input device interface
  10. 软考-高项-论文-信息系统项目的进度管理