OKHttp的簡單使用

jopen 9年前發布 | 26K 次閱讀 Android開發 移動開發 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!