zoukankan      html  css  js  c++  java
  • OKHttp的容易使用

    OKHttp的简单使用

    一方面,最近关于OKHttp的讨论甚嚣尘上,另一方面,我最近也更新了android6.0,发现在6.0中HttpClient不能使用了,于是决定抽时间也看一下OKHttp,总结了一点东西,与大家分享。

    以前读书的时候在学校用过GitHub上的一个开源控件AsyncHttpClient,当时解决了不少问题,上传图片以及download都能实现,感觉还不错,这次看完OKHttp,暂未发现两者在功能上的差异(如果哪位小伙伴发现了可以告诉我一下)。

    官网对OKHttp的介绍还是比较详细,英文好的同学可以直接看官网的内容。使用OKHttp我们就需要OKHttp的jar包,同时由于OKHttp依赖于Okio,我们也需要下载Okio的jar包。这两个准备工作做好了就可以开始了。


    一、发送Get请求

    Request是OKHttp访问的请求,Callback是回调,有两种调用方式,一种是call.execute,这种方式不会开启新的线程,要在android中使用这个需要自己开启一个新线程,然后在线程中调用这个东西,这样反而麻烦了,所以个人推荐使用call.enqueue,call.enqueue会开启一个新的线程,在新线程中调用网络请求。这样的话我们就得通过Handler来与android UI交互了。

            okHttpClient = new OkHttpClient();
            request = new Request.Builder().url(HTTPURL).build();
            Call call = okHttpClient.newCall(request);
            // 开启异步线程访问网络
            call.enqueue(new Callback() {
    
                @Override
                public void onResponse(Response response) throws IOException {
                    String res = response.body().string();
                    Message msg = new Message();
                    msg.what = REFRESHDATA;
                    msg.obj = res;
                    mHandler.sendMessage(msg);
                }
    
                @Override
                public void onFailure(Request arg0, IOException arg1) {
    
                }
            });

    二、发送POST请求

    发送POST请求,一种是提交JSON数据:

    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            RequestBody body = RequestBody.create(JSON,
                    "{"username":"lisi","nickname":"李四"}");
            Request request = new Request.Builder().url(HTTPURL).post(body).build();
            //后面的调用与GET相同

    还有一种是提交键值对:

    RequestBody formBody = new FormEncodingBuilder()
                    .add("username", "lisi").add("nickname", "李四").build();
            Request request = new Request.Builder().url(HTTPURL).post(formBody)
                    .build();

    总结

    其实OKHttp相对于HttpURLConnection已经简单了许多,但是我还是觉得麻烦,而且官方亦不建议我们创建多个OkHttpClient实例,于是又对它进行了一层简单的封装。

    import java.io.IOException;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import com.squareup.okhttp.Callback;
    import com.squareup.okhttp.OkHttpClient;
    import com.squareup.okhttp.Request;
    import com.squareup.okhttp.Response;
    
    /**
     * OKHttp封装工具类
     * 
     * @author wangsong
     * 
     *         2015-10-9
     */
    public class OKHttpUtils {
    
        private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient();
        static {
            M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS);
        }
    
        /**
         * 不开启异步线程
         * 
         * @author wangsong 2015-10-9
         * @param request
         * @return
         * @throws IOException
         */
        public static Response execute(Request request) throws IOException {
            return M_OK_HTTP_CLIENT.newCall(request).execute();
        }
    
        /**
         * 开启异步线程访问,访问结果自行处理
         * 
         * @author wangsong 2015-10-9
         * @param request
         * @param responseCallback
         */
        public static void enqueue(Request request, Callback responseCallback) {
            M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback);
        }
        /**
         * 开启异步线程访问,不对访问结果进行处理
         * 
         * @author wangsong 2015-10-9
         * @param request
         * @param responseCallback
         */
        public static void enqueue(Request request) {
            M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {
    
                @Override
                public void onResponse(Response arg0) throws IOException {
                }
    
                @Override
                public void onFailure(Request arg0, IOException arg1) {
                }
            });
        }
    
        /**
         * 为HttpGet请求拼接一个参数
         * 
         * @author wangsong 2015-10-9
         * @param url
         * @param name
         * @param value
         */
        public static String jointURL(String url, String name, String value) {
            return url + "?" + name + "=" + value;
        }
    
        /**
         * 为HttpGet请求拼接多个参数
         * 
         * @author wangsong 2015-10-9
         * @param url
         * @param name
         * @param value
         */
        public static String jointURL(String url, Map<String, String> values) {
            StringBuffer result = new StringBuffer();
            result.append(url).append("?");
            Set<String> keys = values.keySet();
            for (String key : keys) {
                result.append(key).append("=").append(values.get(key)).append("&");
            }
            return result.toString().substring(0, result.toString().length()-1);
        }
    
    }

    本文涉及到的工具类下载地址https://github.com/lenve/OKHttpUtils

  • 相关阅读:
    Java图像处理
    Java图像处理
    Java文字图像识别(1)[88250原创]
    简单的Java图像处理程序
    英语、日语
    My First English Thread
    word的常用操作
    C++中结构体的的慨念和使用方法
    C#调用dll(C++(Win32))时的类型转换总结
    设置VS2008和IE8 调试ATL MFC ActiveX控件
  • 原文地址:https://www.cnblogs.com/awkflf11/p/5750008.html
Copyright © 2011-2022 走看看