OKHTTP封裝使用

最近比較火的是OKhttp+picasso解析混合使用
接下來我們先上Okhttp抓抓數據。

顯然Okhttp裏面的那個onResponse 和 onFailure是非UI線程,那麼我們改變他的話只有發送個通知出來讓其他的UI線程來處理UI變化了,這個時候,屌絲王Handler出場了。

1.okhttp的get請求封裝
直接上代碼:

    public static final int ok_error = -1;
    public static final int ok_success = 1;

    /**
     * okhttp Post請求方式
     */
    public static void OKdoGet(String url, final Handler handler) {

        OkHttpClient client = new OkHttpClient();
        final Request request = new Request.Builder().url(url).build();
        // new call
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                handler.sendEmptyMessage(ok_error);
            }
            @Override
            public void onResponse(final Response response) throws IOException {
                String resultStr = response.body().string();
                Message msg = new Message();
                msg.what = ok_success;
                msg.obj = resultStr;
                handler.sendMessage(msg);
            }
        });
    }

至於Handler裏面怎麼拿自行腦補。

2.Okhttp的post請求封裝

/**
     * Post請求的封裝
     */
    public static void OKdoPost(String url, final Handler handler,
            FormEncodingBuilder builder) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).post(builder.build())
                .build();
        client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Request arg0, IOException arg1) {
                handler.sendEmptyMessage(ok_error);
            }

            @Override
            public void onResponse(Response arg0) throws IOException {
                String resultStr = arg0.body().string();
                Message msg = new Message();
                msg.what = ok_success;
                msg.obj = resultStr;
                handler.sendMessage(msg);
            }
        });
    }

    /**
     * Post請求的封裝
     */
    public static void OKdoPostWithCode(String url, final Handler handler,
            FormEncodingBuilder builder, final int success, final int error) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(url).post(builder.build())
                .build();
        client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Request arg0, IOException arg1) {
                handler.sendEmptyMessage(error);
            }

            @Override
            public void onResponse(Response arg0) throws IOException {
                String resultStr = arg0.body().string();
                Message msg = new Message();
                msg.what = success;
                msg.obj = resultStr;
                handler.sendMessage(msg);
            }
        });
    }

因爲他傳值是不定的,所以咱把FormEncodingBuilder 給抽出來另外加,這樣想怎麼傳就怎麼傳,再者不知道他是成功還是失敗,所以就弄了多的兩個判斷的。

3.post請求的參數方法

       /**
         * post請求
         */
        FormEncodingBuilder builder = new FormEncodingBuilder();
        builder.add("sj_id", "1");
        builder.add("xx", "1");
        builder.add("page", page + "");
        builder.add("oauth_token", "f5fbefc2bd9f538c3010fd24f57eb536");
        OkHttpUtil.OKdoPost(ContextUrl.url, handler, builder);//Post請求方法調用

       /**
         * post請求  帶請求碼
         */
        FormEncodingBuilder builder = new FormEncodingBuilder();
        builder.add("sj_id", "1");
        builder.add("xx", "1");
        builder.add("page", page + "");
        builder.add("oauth_token", "f5fbefc2bd9f538c3010fd24f57eb536");
        OkHttpUtil.OKdoPostWithCode(ContextUrl.url, handler, builder, 3, 4);

4.超時操作
現在問題來了,很多時候網絡訪問的時候會存在各種超時延遲操作,像HttpUrlconnection裏面的設置超時操作。那麼我們的OKHTTP也是需要設置超時操作的,沒有響應時使用超時結束call。沒有響應的原因可能是客戶點鏈接問題、服務器可用性問題或者這之間的其他東西。OkHttp支持連接,讀取和寫入超時。下面看代碼:

private final OkHttpClient client;
public ConfigureTimeouts() throws Exception {
  client = new OkHttpClient();
  //設置連接超時
  client.setConnectTimeout(10, TimeUnit.SECONDS);
  //設置寫入超時
  client.setWriteTimeout(10, TimeUnit.SECONDS);
  //設置讀取超時
  client.setReadTimeout(30, TimeUnit.SECONDS);
}

public void run() throws Exception {
  Request request = new Request.Builder().url("http://www.baidu.com") // This URL is served with a 2 second delay.
      .build();

  Response response=client.newCall(request).execute();
  System.out.println("Response completed: " + response);
}

OKhttp暫時說到這裏,有啥加的再上。

發佈了62 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章