rxjava+Retrofit+okhttp 实战网络请求
来源:互联网 发布:win7安装apache 编辑:程序博客网 时间:2024/05/21 22:08
app 中build.gradle
compile 'io.reactivex.rxjava2:rxjava:2.1.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' compile 'com.squareup.okhttp3:okhttp:3.8.1'
写api接口
public interface ApiService {//干货集中营/** * 分类数据: http://gank.io/api/data/数据类型/请求个数/第几页 * 数据类型: 福利 | Android | iOS * 请求个数: 数字,大于0 * 第几页:数字,大于0 * eg: http://gank.io/api/data/福利/10/1 */ @GET("data/{type}/{pre_page}/{page}") Observable<GankDataBean> getGankIoData(@Path("type") String id, @Path("page") int page, @Path("current_page") int current_page);/** * Create a new ApiService */ class Factory { private Factory() { } public static ApiService createService(String baseUrl) { //ok的配置 OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(15, TimeUnit.SECONDS); builder.connectTimeout(15, TimeUnit.SECONDS); //这里你可以拦截添加个公共参数什么的等等,干啥都行 builder.addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { return null; } }); OkHttpClient client = builder.build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(baseUrl) .client(client) //Gson的转换工厂 .addConverterFactory(GsonConverterFactory.create()) //Observable的适配 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); return retrofit.create(ApiService.class); } }}
在Moudle中
public interface CommonImpl{ void loadSuccess(Object object); void loadFailed(); //便于对事件的管理,在activity销毁的时候我们要中止事件,给clear掉 void addDisaposed(Disposable disposable); } // public void showBannerPage(final CommonImpl listener){ ApiService.Factory.createService(Constants.API_Ganhuo) .getGankIoData("福利",10,1) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<GankDataBean>() { @Override public void onSubscribe(@NonNull Disposable d) { listener.addDisaposed(d); } @Override public void onNext(@NonNull FrontpageBean frontpageBean) { listener.loadSuccess(frontpageBean); } @Override public void onError(@NonNull Throwable e) { listener.loadFailed(); } @Override public void onComplete() { } }); }
在Activity中调用
recommendMoudle.showBannerPage(new RecommendMoudle.CommonImpl() { @Override public void loadSuccess(Object object) { } @Override public void loadFailed() { } @Override public void addDisaposed(Disposable disposable) { } });
最近整理的时候,把APiService中的接口部分抽出来,将网络请求部分放到另一个单独的类中,简单的封装了一下,
/** * Created by great小海海 on 2017/7/13. *网络请求的封装定制类 */public class ServiceManager { //设缓存有效期为1天 private static long CACHE_STALE_SEC = 60 * 60 * 24 * 1; //查询缓存的Cache-Control设置,为if-only-cache时只查询缓存而不会请求服务器,max-stale可以配合设置缓存失效时间 private static String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC; private static ServiceManager mServiceManage; private Retrofit retrofit; public static ServiceManager getInstance(String baseUrl){ if (mServiceManage==null){ mServiceManage = new ServiceManager(baseUrl); } return mServiceManage; } private ServiceManager(String baseUrl){ //缓存目录 File files = new File(Environment.getDownloadCacheDirectory().toString(),"cache"); //缓存大小为10M int cacheSize = 10 * 1024 * 1024; Cache mCache = new Cache(files,cacheSize); OkHttpClient.Builder builder = new OkHttpClient().newBuilder(); builder.readTimeout(10, TimeUnit.SECONDS); builder.connectTimeout(10, TimeUnit.SECONDS); builder.cache(mCache); builder.addNetworkInterceptor(sRewriteCacheControlInterceptor); if (BuildConfig.DEBUG) { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(interceptor); } OkHttpClient client = builder.build(); retrofit= new Retrofit.Builder().baseUrl(baseUrl) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } public <T>T creat(Class<T> service){ return retrofit.create(service); } /** * 这个拦截类是看别人写的,大家可以做个参考 * 云端响应头拦截器,用来配置缓存策略 * Dangerous interceptor that rewrites the server's cache-control header. */ private static final Interceptor sRewriteCacheControlInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (!CheckNetwork.isNetworkConnected(MyApp.getSingleInstance())){ request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build(); } Response originalResponse = chain.proceed(request); if (CheckNetwork.isNetworkConnected(MyApp.getSingleInstance())) { //有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置 String cacheControl = request.cacheControl().toString(); return originalResponse.newBuilder() .header("Cache-Control", cacheControl) //pragma也是控制缓存的一个消息头属性,要移除掉然后重新设置缓存策略 .removeHeader("Pragma") .build(); } else { return originalResponse.newBuilder() .header("Cache-Control", "public, " +CACHE_CONTROL_CACHE) .removeHeader("Pragma") .build(); } } };
这样APiService中只剩了接口的定义,用法还是差不多的
原来:ApiService.Factory.createService(Constants.API_Ganhuo)
现在: ServiceManager.getInstance(Constants.API_DOUBAN).creat(ApiService.class)
阅读全文
1 0
- rxjava+Retrofit+okhttp 实战网络请求
- Android okHttp 实战(五):okHttp网络请求之Retrofit+Okhttp+RxJava组合
- 网络请求框架 Rxjava+ReTrofit+okHttp+MVP
- 封装Retrofit + okhttp + rxjava网络请求框架
- RxJava+Retrofit+OkHttp实战
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- Android Retrofit+rxjava+okhttp请求网络的基本用法
- RxJava+Retrofit+OkHttp组合在网络请求中的简单配置
- 打造属于自己的网络请求框架(OKHttp+Retrofit+RxJava)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- rxjava+retrofit+okhttp实现流行的网络请求
- Android网络请求发展简史和RxJava+Retrofit+OkHttp实践
- Android网络请求发展简史和RxJava+Retrofit+OkHttp实践
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- RxJava+Retrofit+OkHttp深入浅出-终极封装二(网络请求)
- ACM-DataStructure-Day3 Error Correction
- phpMyAdmin
- 数据抽取方式和各方式特点
- spring中异步配置
- Z字形编排
- rxjava+Retrofit+okhttp 实战网络请求
- 初始化容器
- [LeetCode]127. Word Ladder 深入浅出讲解和代码示例
- 记:第一次使用Nginx搭建图片服务器
- 一起做RGB-D SLAM(5)
- Android BottomNavigationView与ViewPager+fragment结合实现material Tab标准效果
- 最长公共子序列(LCS)
- JAVA图片压缩
- LINUX(CENTOS7.X)SVN部署文档