retrofit + RXjava 网络解析(网络解析封装)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_beicai/article/details/80362318
前言:
android 的网络解析发展史不断的在更新,
HttpClient & HttpURLConnection & Volley & OkHttp & retrofit + RXjava
现在市场上很火的是retrofrt+RXjava 网络请求框架;功能强大,简单易用,
下面会简单的介绍下retrofrt + Rxjava, 以及 你们关注的重点,封装retrofrt + rxjava

1. 简介
1.1 Retrofrt :
Retrofrt是Square公司开发的一款正对android网络请求的框架,底层基于OkHttp实现,OkHttp已经得到了Google的官方认证,
OkHttp 也是Square开源的网络请求框库
1.2 RXJava :
官方给的解释: 一个在java VM上使用可观测的序列来组成的异步,基于事件的程序库
也就是说RXjava 可以让异步操作起来更加简单。

各自的职责:
Retrofrt 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RXjava负责异步,各种线程之间的切换,

2. 封装Retrofrt + RXjava
2.1 添加依赖
//Retrofit2+rxjava
compile 'io.reactivex:rxjava:1.1.6'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.+'
compile 'com.squareup.retrofit2:adapter-rxjava:2.+'
compile 'com.google.code.gson:gson:2.7'

2.2 在Mainfeast.xml 文件中添加权限:
<uses-permission android:name="android.permission.INTERNET" />
<usespermissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2.3 添加回调接口
(直接撸代码)
public abstract class BaseCallback<T extends BaseBean> extends Subscriber<T> {
@Override
public void onNext(T t) {
success(t);
}

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable e) {
if(e != null){
e.printStackTrace();
}
}
/**
* 服务端返回成功
* @param t 响应数据
*/
public abstract void success(T t);
}

2.4 进行真正的封装
public class RetrofitHelper {
private static OkHttpClient okHttpClient = null;
public static <T> T create(Class<T> clazz) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.BASE_URL)
//这里指定使用
.callFactory(okHttpClient)
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
//增加返回值为Observable<T>的支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(clazz);//这里采用的是Java的动态代理模式
}
//仅作为临时baseurl解决方案
public static <T> T createQRCode(Class<T> clazz) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Config.QR_CODE_URL)
//这里指定使用
.callFactory(okHttpClient)
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
//增加返回值为Observable<T>的支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(clazz);//这里采用的是Java的动态代理模式
}
static {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//配置拦截器
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request originalRequest = chain.request();
HttpUrl.Builder urlBuilder = originalRequest.url().newBuilder();
//统一添加参数
String token;
if (UserModel.getUserBean() != null && UserModel.getUserBean().getToken() != null) {
token = UserModel.getUserBean().getToken();
}else{
token = "";
}
urlBuilder.addQueryParameter("token", token)/*.addQueryParameter("type", "Android")*/;
HttpUrl url = urlBuilder.build();
//统一添加header
Request request = originalRequest.newBuilder().addHeader("User-Agent", "Android")
.addHeader("markVal","Mobile")
.url(url)
.build();
if (BuildConfig.DEBUG) {
//打印POST请求
StringBuilder paramsBuilder = new StringBuilder();
if (originalRequest.body() instanceof FormBody) {
FormBody newBody = (FormBody) originalRequest.body();
for (int i = 0, j = newBody.size(); i < j; i++) {
paramsBuilder.append("&");
paramsBuilder.append(newBody.name(i));
paramsBuilder.append("=");
paramsBuilder.append(newBody.value(i));
}
}
Log.e(Config.TAG, request.headers() + ";" + url.url().toString() + paramsBuilder.toString());
}
return chain.proceed(request);
}
};
SSLContext sslContext = SSLContextUtil.getDefaultSLLContext();
if (sslContext != null){
builder.sslSocketFactory(sslContext.getSocketFactory());
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
okHttpClient = builder
.addInterceptor(interceptor)
.retryOnConnectionFailure(true)
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
}
/**
* 直接转换为字符串
* @param clazz Class
* @param <T> API
* @return T
*/
public static <T> T createString(Class<T> clazz) {
return createString(clazz, Config.BASE_URL);
}

/**
* 直接转换为字符串(指定服务器地址)
* @param clazz Class
* @param url String
* @param <T> API
* @return T
*/
public static <T> T createString(Class<T> clazz, String url) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
//这里指定使用
.callFactory(okHttpClient)
//增加返回值为Observable<T>的支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(StringConverterFactory.create())
.build();
return retrofit.create(clazz);
}
}

到此封装完毕,那么如何使用?

3. 使用封装的网络请求框架

//网络请求方式
RetrofitHelper.
create(MainService.class).
getDetailProduct(itemcode).
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).subscribe(new BaseCallback<BaseBean<ProductDetaiBean>>() {
@Override
public void success(BaseBean<ProductDetaiBean> pageBeanBaseBean) {
Log.e(TAG, "请求成功" + pageBeanBaseBean.getdata);
}

@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "请求错误" + e);
}
});

4. 运行效果:

5. 项目地址:

https://download.csdn.net/download/wk_beicai/10422582




猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/80362318