Android-Http-Example

Introduction: 集成了 android-async-http, volley, okhttp3 等网络请求框架,进一步封装抽象出统一的 post、get 接口等。方便底层直接切换网络库
More: Author   ReportBugs   
Tags:
android-async-http-volley-okhttp3-网络请求-

Android 网络请求的统一封装和调用.集成了 android-async-http, volley, okhttp3 等网络请求框架.可直接切换底层库.

1 简介

架构分层

总共分为三层:

  1. 网络请求调用层. app 统一调用该层接口和这层提供的回调,该层可以切换不同的网络请求库.
  2. 网络请求库封装层. 封装了开源的 Android 网络请求库请求对外提供的方法.
  3. 胶水层.负责调用层和封装层的连接.调用网络封装层的接口并将返回 responseHandler 转为调用层自定义的 responseHandler.

功能

  1. post get 请求
  2. cookie 功能
  3. 上传文件
  4. 下载文件
  5. 取消请求(页面销毁时可调用,防止页面销毁异步请求未取消而导致的 crash)

集成的第三方网络请求库

android-async-http

官网:http://loopj.com/android-async-http/

文档:https://loopj.com/android-async-http/doc/

示例:https://github.com/loopj/android-async-http/tree/master/sample/src/main/java/com/loopj/android/http/sample

注意点:

  1. 取消请求接口 cancelAllRequest,cancelRequest,cancelRequestByTag 都必须在 post,get 时加上参数 Context,否则 cancel 不起作用

volley

Git 地址:https://android.googlesource.com/platform/frameworks/volley

官网地址:https://developer.android.com/training/volley/index.html?hl=zh-cn

郭霖的 volley 解析:http://blog.csdn.net/guolin_blog/article/details/17482095

注意点:

  1. git clone 后选用 android-6.0.1_25 tag 的版本,用 master 最新的引入出错
  2. 将下载后的 volley 删除.git 目录和 src 下 test 目录,然后拷贝到项目目录中
  3. 修改项目 setting.gradle 添加":volley",并修改 volley 的 gradle 版本变为项目一样的版本,最好项目 app 添加 dependency 即引入 volley 成功
  4. volley 仅实现 post 和 get 请求,upload 和 download 未实现.(volley 不适合大数据下载文件下载等,因为 volley 会在 parse 过程中将数据缓存在内存中)
  5. volley cacelRequest 无 onCancel 事件触发
  6. volley 只能获取第一个 cookie,如果需要多个 cookie 参考此文章

okhttp3

官方地址: http://square.github.io/okhttp/

注意点:

2 项目结构

统一调用层

  1. MyHttp.java (调用入口)
  2. MyHttpJsonResponseHandler.java (请求回调 json 数据)
  3. MyHttpFileResponseHandler.java (文件下载回调)

android-async-http

  1. LibAsyncHttp.java (封装了 android-async-http 对外提供的接口)
  2. MyAsyncHttp.java (android-async-http 和 myhttp 之间连接层)

volley

  1. LibVolley.java (封装了 volley 的对外 post get 接口)
  2. LibVolleyResponseModel.java (volley 返回数据封住)
  3. LibVolleyJSONObjectRequest.java (volley 自定义的 request)
  4. MyVolley.java (volley 和 myhttp 之间连接层)

okhttp

  1. LibOkHttp.java (封装了 okhttp 的对外接口)
  2. MyOkHttp.java (okhttp 和 myhttp 之间连接层)

3 调用示例

        //post 请求
        private void doPostHttp() {
            //文本参数
            Map<String, String> params = new HashMap<String, String>();
            params.put("uid", "111");

            //post
            MyHttp.doPost(this, "http://192.168.3.1/test_post.php", params, new MyHttpJsonResponseHandler() {
                @Override
                public void onSuccess(int statusCode, JSONObject response) {
                    Log.i("tsy", "onSuccess status code=" + statusCode + " response=" + response);
                }

                @Override
                public void onFailure(int statusCode, String error_msg) {
                    Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
                }

                @Override
                public void onCancel() {
                    Log.i("myhttp", "request on cancel");
                }
            });
        }

        //get 请求
        private void doGetHttp() {
            //文本参数
            Map<String, String> params = new HashMap<String, String>();
            params.put("uid", "111");

            //get
            MyHttp.doGet(this, "http://192.168.3.1/test_post.php", params, new MyHttpJsonResponseHandler() {
                @Override
                public void onSuccess(int statusCode, JSONObject response) {
                    Log.i("tsy", "onSuccess status code=" + statusCode + " response=" + response);
                }

                @Override
                public void onFailure(int statusCode, String error_msg) {
                    Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
                }

                @Override
                public void onCancel() {
                    Log.i("myhttp", "request on cancel");
                }
            });
        }

        //上传文件
        private void doUpload() {
            //文件参数
            File file = new File(Environment.getExternalStorageDirectory() + "/girls/head/output_tmp2.jpg");
            Map<String, File> files = new HashMap<String, File>();
            files.put("avatar", file);

            //upload
            MyHttp.doUpload(this, "http://192.168.3.1/test_post.php", files, new MyHttpFileResponseHandler() {
                @Override
                public void onSuccess(int statusCode) {
                    Log.i("tsy", "onSuccess status code=" + statusCode);
                }

                @Override
                public void onFailure(int statusCode, String error_msg) {
                    Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
                }

                @Override
                public void onProgress(long bytesWritten, long totalSize) {
                    Log.i("tsy", String.format("Progress %d from %d" +
                     " (%2.0f%%)", bytesWritten, totalSize, (totalSize > 0) ? (bytesWritten * 1.0 / totalSize) * 100 : -1));
                }

                @Override
                public void onCancel() {
                    Log.i("tsy", "request on cancel");
                }
            });
        }

        //下载文件
        private void doDownload() {
            File file = new File(Environment.getExternalStorageDirectory() + "/girls/head/output_tmp2.jpg");    //下载后存储的 file 位置
            MyHttp.doDownload(this, "http://192.168.3.1/head.jpg", file, new MyHttpFileResponseHandler() {
                @Override
                public void onSuccess(int statusCode) {
                    Log.i("tsy", "onSuccess status code=" + statusCode);
                }

                @Override
                public void onFailure(int statusCode, String error_msg) {
                    Log.i("tsy", "onFailure status code=" + statusCode);
                }

                @Override
                public void onProgress(long bytesWritten, long totalSize) {
                    Log.i("tsy", String.format("Progress %d from %d (%2.0f%%)", bytesWritten, totalSize, (totalSize > 0) ? (bytesWritten * 1.0 / totalSize) * 100 : -1));
                }

                @Override
                public void onCancel() {
                    Log.i("tsy", "request on cancel");
                }
            });
        }

        //页面销毁关闭请求 防止 crash 建议放到 BaseActivity BaseFragrament 里面
        @Override
        protected void onDestroy() {
            super.onDestroy();

            MyHttp.cancelRequest(this);     //页面退出 关闭所有请求
        }

欢迎关注我的公众号

我的公众号

Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea