封装Retrofit + okhttp + rxjava网络请求框架
来源:互联网 发布:bootstrap input控件js 编辑:程序博客网 时间:2024/05/24 03:22
前言
现在Android 市面上很火的当然是 Retrofit+RxJava + OkHttp, 功能强大,简单易用,因此选用这套方案来改造网络库。Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现,OkHttp 已经得到了google 官方的认可。Retrofit官网
OkHttp: 也是Square 开源的网络请求库
RxJava:RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。总之就是让异步操作变得非常简单。
各负其责:
Retrofit 负责请求的数据和请求的结果,使用接口的方式呈 现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。
RxJava + Retrofit + okHttp 已成为当前Android 网络请求最流行的方式。
下面封装 一个 Retrofit + RxJava + OkHttp 的工具类 。
实现
第一步:在app下的builder.gradle中添加依赖库
implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.okhttp3:okhttp:3.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' implementation 'io.reactivex:rxjava:1.3.0' implementation 'io.reactivex:rxandroid:1.2.1' implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
第二步:写接口,新建一个Interface 开始写接口
模拟一个登陆接口
public interface ApiInterface { @FormUrlEncoded @POST("api/login") Observable<Login> login(@Field("username") String username, @Field("password") String password);}
重点来了: 开始封装网络请求框架
import android.util.Log;import com.google.gson.Gson;import com.google.gson.GsonBuilder;import java.io.IOException;import java.util.concurrent.TimeUnit;import okhttp3.Interceptor;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;import retrofit2.Retrofit;import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;import retrofit2.converter.gson.GsonConverterFactory;import rx.Observable;import rx.Subscriber;import rx.android.schedulers.AndroidSchedulers;import rx.schedulers.Schedulers;/** * Created by 梁on */public class HttpClient { private static HttpClient httpClient = null ; private final ApiInterface apiInterface; //接口对象//同步锁,单例模式,保证多线程访问的安全 public static synchronized HttpClient getInstance(){ if(httpClient == null) { httpClient = new HttpClient() ; } return httpClient ; } /* * 构造方法 * */ private HttpClient() { OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(8, TimeUnit.SECONDS) //连接超时时间 .readTimeout(8,TimeUnit.SECONDS) //读取超时时间 .writeTimeout(8,TimeUnit.SECONDS) //写超时时间 .addInterceptor(new Interceptor() { //过滤器 @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); Request request = original.newBuilder() .addHeader("token", "token") //添加token .method(original.method(), original.body()) .build(); return chain.proceed(request); } }) .build(); Gson gson = new GsonBuilder().serializeNulls().setLenient().create(); //setLenient()严格按照日期的方式解析json Retrofit retrofit = new Retrofit.Builder() .baseUrl("这里是你的url地址") .addConverterFactory(GsonConverterFactory.create(gson)) //配置转化库 默认是 json .client(okHttpClient) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); apiInterface = retrofit.create(ApiInterface.class);//创建接口的实例 } private void toSubscribe(Observable o, Subscriber s) { o.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s); } /** * 登陆 * * @param subscriber * @param username 用户名 * @param password 密码 */ public void login(Subscriber<Login> subscriber ,String username, String paassword){ Observable<Login> observable = apiInterface.login(username,paassword); observable.subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); }}
第三步:写实体类 Login,也就是要 写gson 解析json 的字段名,以下就不贴出来了
第四步 在activity中调用
HttpClient.getInstance().login(new Subscriber<Login>() { //请求成功 @Override public void onCompleted() { Toast.makeText(MainActivity.this,"cehnggong",Toast.LENGTH_SHORT).show(); }//请求失败 @Override public void onError(final Throwable e) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,e.getLocalizedMessage(),Toast.LENGTH_SHORT).show(); } }); } @Override public void onNext(Login login) {//在此处理请求成功以后的逻辑 Toast.makeText(MainActivity.this,"onNext",Toast.LENGTH_SHORT).show(); }},"用户名","123456");
工具可以直接贴出来 直接使用。
- 封装Retrofit + okhttp + rxjava网络请求框架
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- retrofit+RxJava+okhttp简便封装实现网络请求(详解)
- Retrofit和RxJava加OkHttp网络请求进行二次封装
- 如何封装自己的网络框架(RxJava+okHttp+Retrofit)
- 打造属于自己的网络请求框架(OKHttp+Retrofit+RxJava)
- Retrofit+OKhttp+RxJava框架的封装
- RxJava + Retrofit + OKHttp + RxLifecycle进一步封装网络
- Retrofit+Rxjava网络封装框架
- Retrofit+okhttp网络框架请求
- rxjava+Retrofit+okhttp 实战网络请求
- Retrofit+RxJava网络请求框架
- 封装RxJava+Retrofit+OkHttp
- android 网络框架学习(okhttp,retrofit,rxjava)
- PAT训练(乙级)—— 1021. 个位数统计 (15)
- CUDA学习笔记(6) 共享内存与全局内存
- TCP/TP基础(二)以太网协议,ARP协议,ICMP协议
- 我们为什么不用c++写网页?
- CkEditor使用技巧
- 封装Retrofit + okhttp + rxjava网络请求框架
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
- linux常见命令含义
- 【bzoj5107】[CodePlus2017]找爸爸
- grunt serve -f报错:Local npm module "xxx"not find,is it install?
- 利用JDBC对数据库进行简单的操作
- 踩坑全记录——工具系列
- Linux下Nodejs安装(完整详细)
- 嵌入式工程师常用的IIC和SPI总线协议,今天来说透!