论坛首页 移动开发技术论坛

Android开发——OKHttp用法详解

浏览 3258 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2015-10-14   最后修改:2015-10-14
本文主要讲述了OKHttp类库的发送Get请求和Post请求的用法,现在整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。

官网对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

本文转载至:http://www.mobile-open.com/2015/85023.html
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics