OKHttp的使用

来源:互联网 发布:mac玩游戏怎么全屏 编辑:程序博客网 时间:2024/06/08 04:16

一、概念



什么是OKHttp

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。

OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。

使用 OkHttp 无需重写您程序中的网络代码。OkHttp实现了几乎和java.net.HttpURLConnection一样的API。如果你用了 Apache HttpClient,则OkHttp也提供了一个对应的okhttp-apache 模块。



二、特点


OkHttp支持如下的特性:

      • 一般的get请求
      • 一般的post请求
      • 基于Http的文件上传
      • 文件下载
      • 加载图片
      • 支持请求回调,直接返回对象、对象集合
      • 支持session的保持

三、使用


1. 使用Get请求网络数据

如下是接收数据的接口

    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case GET:                    //获取数据                    tv_result.setText((String) msg.obj);                    break;                case POST:                    //获取数据                    tv_result.setText((String) msg.obj);                    break;            }        }    };

下面是get请求

    private void getDataFromGet() {        new Thread() {            @Override            public void run() {                super.run();                try {                    String result = get("http://api.m.mtime.cn/PageSubArea/TrailerList.api");                    Log.e("TAG", result);                    Message msg = Message.obtain();                    msg.what = GET;                    msg.obj = result;                    handler.sendMessage(msg);                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }
    private String get(String url) throws IOException {        Request request = new Request.Builder()                .url(url)                .build();        Response response = client.newCall(request).execute();        return response.body().string();    }

2. 使用Post请求网络数据

    private void getDataFromPost() {        new Thread() {            @Override            public void run() {                super.run();                try {                    String result = post("http://api.m.mtime.cn/PageSubArea/TrailerList.api", "");                    Log.e("TAG", result);                    Message msg = Message.obtain();                    msg.what = POST;                    msg.obj = result;                    handler.sendMessage(msg);                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();    }
    private String post(String url, String json) throws IOException {        RequestBody body = RequestBody.create(JSON, json);        Request request = new Request.Builder()                .url(url)                .post(body)                .build();        Response response = client.newCall(request).execute();        return response.body().string();    }

3. 使用OkHttpUtils来请求文本数据

    /**     * 使用okhttp-utils的get请求网络文本数据     */    public void getDataGetByOkhttpUtils() {        String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";//        url="http://www.391k.com/api/xapi.ashx/info.json?key=bd_hyrzjjfb4modhj&size=10&page=1";        url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";        OkHttpUtils                .get()                .url(url)                .id(100)                .build()                .execute(new MyStringCallback());    }    /**     * 使用okhttp-utils的post请求网络文本数据     */    public void getDataPostByOkhttpUtils() {        String url = "http://www.zhiyun-tech.com/App/Rider-M/changelog-zh.txt";//        url="http://www.391k.com/api/xapi.ashx/info.json?key=bd_hyrzjjfb4modhj&size=10&page=1";        url = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";        OkHttpUtils                .post()                .url(url)                .id(100)                .build()                .execute(new MyStringCallback());    }    public class MyStringCallback extends StringCallback {        @Override        public void onBefore(Request request, int id) {            setTitle("loading...");        }        @Override        public void onAfter(int id) {            setTitle("Sample-okHttp");        }        @Override        public void onError(Call call, Exception e, int id) {            e.printStackTrace();            tv_result.setText("onError:" + e.getMessage());        }        @Override        public void onResponse(String response, int id) {            Log.e(TAG, "onResponse:complete");            tv_result.setText("onResponse:" + response);            switch (id) {                case 100:                    Toast.makeText(OKHttpActivity.this, "http", Toast.LENGTH_SHORT).show();                    break;                case 101:                    Toast.makeText(OKHttpActivity.this, "https", Toast.LENGTH_SHORT).show();                    break;            }        }        @Override        public void inProgress(float progress, long total, int id) {            Log.e(TAG, "inProgress:" + progress);            mProgressBar.setProgress((int) (100 * progress));        }    }

4. 使用OkHttpUtils下载大文件

    /**     * 使用okhttp-utils下载大文件     */    public void downloadFile()    {        String url = "http://vfx.mtime.cn/Video/2016/07/24/mp4/160724055620533327_480.mp4";        OkHttpUtils//                .get()//                .url(url)//                .build()//                .execute(new FileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(), "okhttp-utils-test.mp4")//                {                    @Override                    public void onBefore(Request request, int id)                    {                    }                    @Override                    public void inProgress(float progress, long total, int id)                    {                        mProgressBar.setProgress((int) (100 * progress));                        Log.e(TAG, "inProgress :" + (int) (100 * progress));                    }                    @Override                    public void onError(Call call, Exception e, int id)                    {                        Log.e(TAG, "onError :" + e.getMessage());                    }                    @Override                    public void onResponse(File file, int id)                    {                        Log.e(TAG, "onResponse :" + file.getAbsolutePath());                    }                });    }

5. 使用OKHttpUtils上传多个文件

    /**     * 使用okhttp-utils上传多个或者单个文件     */    public void multiFileUpload()    {        String mBaseUrl = "http://192.168.0.165:8080/FileUpload/FileUploadServlet";        File file = new File(Environment.getExternalStorageDirectory(), "afu.png");        File file2 = new File(Environment.getExternalStorageDirectory(), "test.txt");        if (!file.exists()||!file2.exists())        {            Toast.makeText(OKHttpActivity.this, "文件不存在,请修改文件路径", Toast.LENGTH_SHORT).show();            return;        }        Map<String, String> params = new HashMap<>();        params.put("username", "user");        params.put("password", "123");        String url = mBaseUrl ;        OkHttpUtils.post()//                .addFile("mFile", "server_afu.png", file)//                .addFile("mFile", "server_test.txt", file2)//                .url(url)                .params(params)//                .build()//                .execute(new MyStringCallback());    }

6. 使用OKHttpUtils显示图片

    public void getImage()    {        tv_result.setText("");        String url = "http://images.csdn.net/20150817/1.jpg";        OkHttpUtils                .get()//                .url(url)//                .tag(this)//                .build()//                .connTimeOut(20000)                .readTimeOut(20000)                .writeTimeOut(20000)                .execute(new BitmapCallback() {                    @Override                    public void onError(Call call, Exception e, int id) {                        tv_result.setText("onError:" + e.getMessage());                    }                    @Override                    public void onResponse(Bitmap bitmap, int id) {                        Log.e("TAG", "onResponse:complete");                        iv_icon.setImageBitmap(bitmap);                    }                });    }







原创粉丝点击