這個(gè)是我封裝的最簡(jiǎn)單的版本耘斩。不適合使用到真實(shí)項(xiàng)目中,其實(shí)使用了一般也沒問題桅咆,但是不建議括授,這個(gè)真實(shí)項(xiàng)目最好更靈活的重新封裝一下
下面直接給使用方法吧,有些東西岩饼,如果初學(xué)者會(huì)用就行了荚虚。
過陣子會(huì)教你一步一步封裝這個(gè)方法,保證看的懂能理解籍茧。
先看如何使用吧
String url = "http://www.baidu.com";
OkHttpUtils.getInstance().startPost(url, null,new OnNetResultListener() {
@Override
public void onSuccessListener(String successResult) {
LogUtil.i("successResult : " + successResult);
}
@Override
public void onFailureListener(String errorResult) {
LogUtil.i("errorResult : " + errorResult);
}
});
上面的代碼是調(diào)用一個(gè)請(qǐng)求的過程版述。這個(gè)是通過post請(qǐng)求的,需要一個(gè)url硕糊,我這里不需要參數(shù)直接用了null院水。參數(shù)用的是map類型存儲(chǔ)的腊徙,new 一個(gè)map 傳進(jìn)去就行的简十。
最后是一個(gè)回調(diào)函數(shù),數(shù)據(jù)返回了 會(huì)在回調(diào)函數(shù)里面出現(xiàn)撬腾,一般我們用json數(shù)據(jù)螟蝙,這時(shí)候可以解析,然后使用了民傻。整個(gè)網(wǎng)絡(luò)請(qǐng)求還是非常簡(jiǎn)單的胰默。
這里需要特別注意一點(diǎn)就是场斑,運(yùn)行這個(gè)需要網(wǎng)絡(luò)權(quán)限,如何寫在Glide那篇文章里面有 非常簡(jiǎn)單
<uses-permission android:name="android.permission.INTERNET"/>
下面是引用OkHttp的代碼牵署,這里封裝了3.8.其實(shí)每個(gè)版本封裝都差不多漏隐。先用這個(gè)就好∨福看懂這個(gè)新版本也會(huì)封裝了
compile 'com.squareup.okhttp3:okhttp:3.8.0'
源碼
package com.iscoding.demo.zhihu.http;
import android.os.Handler;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* 類功能:OkHttp的簡(jiǎn)單封裝 青责,方便使用
* 公司:IsCoding工作室
* 作者:IsCoding
* 郵箱:iscoding@126.com QQ:1400100300
*/
public class OkHttpUtils {
public enum REQUEST_TYPE {
POST, GET
}
private Handler handler;
private OkHttpClient client;
private static OkHttpUtils INSTANCE;
private OkHttpUtils() {
handler = new Handler();
client = new OkHttpClient.Builder()
// 等線程池, 緩存, 文件下載講完之后再來修改添加
// .retryOnConnectionFailure()
// .cache()
// .readTimeout()
.build();
}
public static OkHttpUtils getInstance() {
if (INSTANCE == null) {
INSTANCE = new OkHttpUtils();
}
return INSTANCE;
}
private void sendRequest(REQUEST_TYPE request_type, final String url, final Map<String, String> header, final Map<String, String> body, final OnNetResultListener listener) {
// 構(gòu)建一個(gè)Request Builder
Request.Builder requestBuilder = new Request.Builder();
//設(shè)置請(qǐng)求的url
requestBuilder.url(url);
//設(shè)置請(qǐng)求頭
setHeader(requestBuilder, header);
if (request_type == REQUEST_TYPE.POST) {
// 構(gòu)建請(qǐng)求體
RequestBody requesBody = getRequestBody(body);
if(requesBody == null){
// 構(gòu)建一個(gè)Request
Request request = requestBuilder.build();
//發(fā)送一個(gè)請(qǐng)求 并處理回調(diào)
createCall(request, listener);
}else{
// 構(gòu)建一個(gè)Request
Request request = requestBuilder.post(requesBody).build();
//發(fā)送一個(gè)請(qǐng)求 并處理回調(diào)
createCall(request, listener);
}
} else if (request_type == REQUEST_TYPE.GET) {
// 構(gòu)建一個(gè)Request
Request request = requestBuilder.get().build();
//發(fā)送一個(gè)請(qǐng)求 并處理回調(diào)
createCall(request, listener);
}
}
private RequestBody getRequestBody(final Map<String, String> body) {
if(body==null || body.size()<=0){
return null;
}
FormBody.Builder buildder = new FormBody.Builder();
Set set = body.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
String value = body.get(key);
buildder.add(key, value);
}
RequestBody requesBody = buildder.build();
return requesBody;
}
private void setHeader(Request.Builder requestBuilder, final Map<String, String> header) {
if(header==null || header.size()<=0){
return;
}
Set headSet = header.keySet();
Iterator headI = headSet.iterator();
while (headI.hasNext()) {
String k = (String) headI.next();
String v = header.get(k);
requestBuilder.addHeader(k, v);
}
}
//請(qǐng)求并處理回調(diào)
private void createCall(Request request, final OnNetResultListener listener) {
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
final String errMsg = e.getMessage();
// 發(fā)回主線程
handler.post(new Runnable() {
@Override
public void run() {
listener.onFailureListener(errMsg);
}
});
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String str = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
listener.onSuccessListener(str);
}
});
}
});
}
// *********************提供給外部的操作方法*************************
// 封裝: 對(duì)外提供使用方式, 具體的實(shí)現(xiàn)細(xì)節(jié)封裝起來
public void startGet(String url, OnNetResultListener listener) {
// _startGet(url, listener);
sendRequest(REQUEST_TYPE.GET, url, null, null, listener);
}
public void startHeader(String url, Map<String, String> headers, OnNetResultListener listener) {
sendRequest(REQUEST_TYPE.GET, url, headers, null, listener);
}
public void startPost(String url, Map<String, String> body, OnNetResultListener listener) {
sendRequest(REQUEST_TYPE.POST, url, null, body, listener);
}
public void startPost(String url, Map<String, String> body, Map<String, String> headers, OnNetResultListener listener) {
sendRequest(REQUEST_TYPE.POST, url, headers, body, listener);
}
}
下面是回調(diào)函數(shù)
package com.iscoding.demo.zhihu.http;
/**
* Created by ic on 2018/1/16.
*/
public interface OnNetResultListener {
public void onSuccessListener(String successResult);
public void onFailureListener(String errorResult);
}