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

xiaoxiao2021-02-28  38

前言: 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

转载请注明原文地址: https://www.6miu.com/read-2624049.html

最新回复(0)