OKHTTP的簡單封裝
阿新 • • 發佈:2019-01-26
import android.os.Handler;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Map;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* 嘗試簡單封裝一下OKhttp
*/
public class OKhttpManager {
//定義成員變數
private OkHttpClient mClient;
private volatile static OKhttpManager sManager;//防止多個執行緒同時訪問
private static Handler handler;//開啟執行緒互動 這裡的handler 是os包下面的
// 使用構造方法,完成初始化
public OKhttpManager() {
mClient=new OkHttpClient();
handler=new Handler();
}
// 使用單例模式,通過獲取的方式拿到物件
public static OKhttpManager getInstance(){
OKhttpManager instance=null;
if (sManager==null){
synchronized (OKhttpManager.class){
if (instance==null){
instance=new OKhttpManager();
sManager=instance;
}
}
}
return instance;
}
// 定義要呼叫的介面
interface Func1{
void onResponse(String result);
}
interface Func2{
void onResponse(byte [] result);
}
interface Func3{
void onResponse(JSONObject jsonObject);
}
// 使編寫的程式碼執行在主執行緒
// 處理請求網路成功的方法,返回的結果是Json串
private static void onSuccessJsonStringMethod(final String jsonValue, final Func1 callBack){
handler.post(new Runnable() {
@Override
public void run() {
if (callBack!=null){
try {
callBack.onResponse(jsonValue);
}catch (Exception e){
e.printStackTrace();
}
}
}
});
}
/**
* 返回響應的結果是Json物件
* @param jsonValue
* @param callBack
*/
private void onSuccessJsonObjectMethod(final String jsonValue, final Func3 callBack){
handler.post(new Runnable() {
@Override
public void run() {
if (callBack!=null){
try{
callBack.onResponse(new JSONObject(jsonValue));
}catch(JSONException e){
e.printStackTrace();
}
}
}
});
}
/**
* 返回響應的結果是byte[]陣列
* @param data
* @param callBack
*/
private void onSuccessByteMethod(final byte[] data,final Func2 callBack){
handler.post(new Runnable() {
@Override
public void run() {
if (callBack!=null){
callBack.onResponse(data);
}
}
});
}
// 然後是呼叫方法
/**
* 請求指定的url返回的結果是Json
* @param url
* @param callBack
*/
public void asyncJsonStringByURL(String url,final Func1 callBack){
final Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
if (response!=null&&response.isSuccessful()){
onSuccessJsonStringMethod(response.body().string(),callBack);
}
}
});
}
/**
* 請求返回的是json物件
*
* @param url
* @param callBack
*/
public void asyncJsonObjectByURL(String url, final Func3 callBack) {
final Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onSuccessJsonObjectMethod(response.body().string(), callBack);
}
}
});
}
/**
* 請求返回的是byte位元組陣列
*/
public void asyncGetByteByURL(String url, final Func2 callBack) {
final Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onSuccessByteMethod(response.body().bytes(), callBack);
}
}
});
}
// 表單提交像一般的姓名和密碼
/**
* 表單提交
* @param url
* @param params
* @param callBack
*/
public void sendComplexForm(String url, Map<String,String> params,final Func1 callBack){
FormBody.Builder form_builder=new FormBody.Builder();//表單物件包含以input開始的物件以html為主
// 非空鍵值對
if (params != null && !params.isEmpty()) {
for(Map.Entry<String,String> entry : params.entrySet()){
form_builder.add(entry.getKey(),entry.getValue());
}
}
RequestBody request_body = form_builder.build();
Request request = new Request.Builder().url(url).post(request_body).build();//採用post方式提交
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(okhttp3.Call call, IOException e) {
}
@Override
public void onResponse(okhttp3.Call call, Response response) throws IOException {
if (response!=null&&response.isSuccessful()){
onSuccessJsonStringMethod(response.body().string(), callBack);
}
}
});
}
}