Android架构设计(Http网络通讯模块优化)

前言:市面上有很多知名的Http框架,比如OKHttp、Volley。而我今天要给大家介绍的是另一款名为“HttpClient”的Http框架,与其他框架不同的是,该框架更注重使用者的用户体验,你可以很容易的掌握它的使用要领。


框架地址:https://github.com/fanqieVip/httpclient

功能清单

支持常用的GET/POST/UPLOAD/DOWNLOAD

支持http/https,默认支持断点续传\断点下载

支持上传、下载进度跟踪

可自由定义Headers、Params

可自由定义FORM、JSON提交方式

支持Request及Response拦截

支持断网自动重连

支持自动过滤重复请求

支持自动缓存、自定义缓存及Request单独禁用缓存

自动识别Activity,Fragment,Dialog,Popuwindow,自动规避回调空指针问题

API

具体的API,其gitub项目网址已做了详细说,我就不再赘述了,接下来我将以问答的形式来阐述它的好用之处!

1.拦截器

  • 我有些请求本身不满足要求,我希望在发出之前就回收,怎么办呢?
  • 我希望能够统一处理请求和返回数据的数据的加密
  • 我希望返回的数据都统一包装成我期望的对象返回到表现层,怎么办呢?
HttpCenter.create(getApplicationContext(), Config.ini()
                            .threadPool(AppUtils.getNumCores() * 5)
                            .connectTimeout(5000)
                            .downloadPath(DOWNLOAD_PATH)
                            .requestInterceptor(new POSTRequestInterceptor())
                            .responseInterceptor(new POSTResponseInterceptor()));

你可以使用拦截器处理以上问题,在requestInterceptor,responseInterceptor你可以很方便的完成处理数据拦截,加解密,数据封装等;

框架的拦截机制是全局的,但并非所有的请求都需要拦截,你可以针对不同的请求对requestInterceptor,responseInterceptor进行禁用;

使用request.enableRequestDispatcherParams(false)可过滤该请求的Request拦截器

使用request.enableResponseDispatcherParams(false)可过滤该请求的Response拦截器

2.上传与下载

  • 我希望我可以跟踪文件的上传和下载进度
  • 我希望文件上传和下载能支持断点上传及下载
  • 我希望在上传和下载过程中如果断网后再恢复,能够自动继续上传和下载
  • 我希望我能随时中断上传和下载


HttpCenter.UploadFile(Request.ini(Response.class)
                .url("您restApi地址")
                .file(new File("你的文件"))
                //回调
                .requestListener(new RequestListener() {
                    @Override
                    public void response(Response response) {

                    }
                    //可以跟踪上传进度
                    @Override
                    public void upload(long current, long size, File file) {
                        super.upload(current, size, file);
                    }
                }));
        //下载文件请求,默认为支持断点下载
        HttpCenter.DownloadFile(Request.ini(Response.class)
                .url("您restApi地址")
                //回调
                .requestListener(new RequestListener() {
                    @Override
                    public void response(Response response) {

                    }
                    //可跟踪下载进度
                    @Override
                    public void download(long current, long size, File file) {
                        super.download(current, size, file);
                    }
                }));

如果你需要终止上传或者下载;你可以使用request.stop();

如果你需要支持自动重连,你可以使用request.enableReconnection(true),该框架并非全局自动重连,你可以在期望支持自动重连的request设置启用重连即可;

3.自动重连与自动过滤重复请求

  • 我有的页面请求的数据的时候断网了,某些框架并不智能,有时会重连有时不会重连,这让我很困扰
  • 某些框架重连的时候经常会导致多次重复调用接口,也造成多次回调,常让人无所适从
  • 多数情况下,我希望自动重连的控制权在我自己手上
  • 有些页面因为业务原因不得不把请求放在onResume中,但放在这里极有可能造成反复调用的性能问题,该怎么办
HttpCenter.POST(Request.ini(this, HelpTypesRes.class)
                .url(ApiPath.getHelpTypes)
                .enableReconnection(true)
                .requestListener(new RequestListener() {
                    @Override
                    public void response(final HelpTypesRes response) {
                        
                    }
                })
        );

该框架本身不会自动重连,只有使用了request.enableReconnection(true)才会针对该请求启用自动重连;

该框架的重连机制非常聪明,它会把网络请求连接返回的错误信息(包括某些异常)解析成网络中断+它发现手机本身未联网来认为需要进行重连,此时该请求并不会发出,而是会存放到一个同步队列中等待监听到手机网络正常后再进行重连,这种重连机制性能好更可靠,并不会出现某些框架出现的时不时不灵的问题;

该框架全局支持自动过滤重复请求,通过对等待请求队列、正在请求队列、等待重连队列的各个关口的监控,他会自动过滤掉重复出现的请求,所以你可以放心的在onResume中使用。

4.智能回调

  • 实际开发中,我们经常出现在窗口中发出请求,但是请求还没回调,窗口就关闭了,空指针等问题就随之而来,有没有什么办法可以一劳永逸,而不需要到处捕获异常?

该框架全局支持智能识别窗口特性,比如activity,fragment,dialog,popuwindow等,当窗口消失,该框架将不再回调。

5.自动缓存与自定义缓存

  • 为了提升http性能,服务端要求我们需要根据Http协议智能缓存数据
  • 我们的服务端开发不规范,有些接口遵守了Http协议的缓存规范,有些又没有,这让我很苦恼,很多框架因此而不能用
  • 我们需要支持缓存,但我们的缓存机制不是基于Http协议
HttpCenter.create(null,
                Config.ini()
                        .charset("你的编码格式")
                        .connectTimeout(20 * 1000)
                        .downloadPath("您的文件下载目录")
                        .proxyHost("").proxyPort(0)
                        //使用Http协议缓存
                        .useDiskCache(DiskCache.init().diskCacheProcessor(new DefaultDiskCacheProcessor()))
                        .threadPool(10)
                        .requestInterceptor(new MyRequestInterceptor())
                        .responseInterceptor(new MyResponseInterceptor()));

该框架默认并不会开启缓存功能,你需要通过.useDiskCache(DiskCache.init().diskCacheProcessor(new DefaultDiskCacheProcessor()))启用缓存;

DefaultDiskCacheProcessor,该默认缓存处理器使用的是基于HTTP协议的缓存机制

HttpCenter.create(null,
                Config.ini()
                        .charset("你的编码格式")
                        .connectTimeout(20 * 1000)
                        .downloadPath("您的文件下载目录")
                        .proxyHost("").proxyPort(0)
                        //使用自定义缓存处理器
                        .useDiskCache(DiskCache.init().diskCacheProcessor(new DiskCacheProcessor() {
                            @Override
                            protected  void putCache(Request request, T response) {

                            }

                            @Override
                            protected  LocalCache getCache(Request request) {
                                return null;
                            }

                            @Override
                            protected void clearCache() {

                            }
                        }))
                        .threadPool(10)
                        .requestInterceptor(new MyRequestInterceptor())
                        .responseInterceptor(new MyResponseInterceptor()));

该框架支持自定义缓存处理器,你可以通过实现DiskCacheProcessor协议实现你DIY的缓存机制

HttpCenter.POST(Request.ini(Response.class)
                .url("您restApi地址")
                .putHeader("", "")
                .putParams("", "")
                //禁用缓存
                .forbidDiskCache()
                //回调
                .requestListener(new RequestListener() {
                    @Override
                    public void response(Response response) {

                    }
                }));

该框架支持缓存针对单个请求禁用缓存;

如果你在框架中启用了缓存机制,则全部请求都会默认启用缓存机制,但你可以针对单个请求禁用缓存;

5.集中管理请求的缓存控制、自动重连

  • 我作为APP的架构人员,我希望网络请求的控制策略集中来让我一人控制,怎么处理?

建议你充分利用拦截器机制,仿照我之前的《Android架构设计(会话管理)》这篇文章,我建议你这么做。

public class ApiPath {
    /**
     * 使用手机号登录接口
     */
    @EnableReConnecting
    @ForbidDiskCache
    @ApiBindModel(UserRes.class)
    public final static String loginByTel = BuildConfig.SERVER_URL+"user/login";
    /**
     * 获取用户资料接口
     */
    @NeedLogin
    @ApiBindModel(UserRes.class)
    public final static String getUserInfo = BuildConfig.SERVER_URL+"user/get/info";
    /**
     * 获取个人中心角标提醒接口
     */
    @NeedLogin
    @ApiBindModel(UCenterSuperscript.class)
    public final static String getUCenterSuperscript = BuildConfig.SERVER_URL+"user/personal/center/marks";
}

你可以自定义以下注解

@EnableReConnecting:允许自动重连
@ForbidDiskCache:禁用缓存

然后在你的requestInterceptor拦截其中解析这些配置信息


结语:HTTP框架有很多,但能把HTTP框架用好也是一门儿艺术,欢迎大家来指正哦!

你可能感兴趣的:(Android架构设计)