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
原创粉丝点击