废话不多讲,直接上代码
package zhangxuelei1506d.utitls;
import android.os.Handler;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by Administrator on 2017/9/6.
* 1、okhttp的中级封装 实现两个功能 从服务器下载数据 从客户端提交数据
* 封装优秀的okhttp:okhttputils,okgo(更深入的封装研究okgo)
* 2、节约内存,使所有的网络请求都用一个okhttpclient和handler对象
* 3、解决okhttp网络请求成功代码在子线程中的问题,把请求成功后的逻辑代码放到主线程中执行
* 简化代码量,
* 知识点: 1、单例模式()2、handler 3、接口 4、okhttp
*/
public class OkHttpManager {
public OkHttpClient mClient;
//定义成员变量
public OkHttpClient okHttpClient;
public static Handler mhandler;
public volatile static OkHttpManager sManagerr;
//使用构造方法完成初始化 私有化操作
private OkHttpManager() {
mClient = new OkHttpClient();
mhandler = new Handler();
}
//使用单例模式通过获取的方式拿到对象
public static OkHttpManager getinstance() {
OkHttpManager instance = null;
if (sManagerr == null) {
synchronized (OkHttpManager.class) {
if (instance == null) {
instance = new OkHttpManager();
sManagerr = instance;
}
}
}
return sManagerr;
}
//定义接口
public interface Func1 {
void onRespense(String resule);
}
public interface Func2 {
void onResponse(byte[] result);
}
interface Func3 {
void onResponse(JSONObject jsonObject);
}
//使handler接口保证 处理数据的逻辑在主线程中
//处理请求网络成功的方法,返回的结果是json字符串
private static void onsuccessjsonStringMethod(final String jsonValue, final Func1 callBack) {
mhandler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.onRespense(jsonValue);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
//处理请求网络成功的方法,返回的结果是字节
private static void onsuccessjsonStringMethod(final byte[] bytes, final Func2 callBack) {
mhandler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.onResponse(bytes);
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
//暴漏提供给外界调用的方法
/**
* 请求指定的url返回的结果是json字符串
*/
public void asyncjsonstringByurl(String url, final Func1 callBack) {
Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//判断response是否有对象,成功
if (response != null && response.isSuccessful()) {
onsuccessjsonStringMethod(response.body().string(), callBack);
}
}
});
}
//提交表单
public void sendComplexFrom(String url, Map<String,String> params, final Func1 callBack) {
FormBody.Builder form_builder = new FormBody.Builder();
//对键值进行非空判断
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
form_builder.add(entry.getKey(),entry.getValue());
}
}
FormBody formBody = form_builder.build();
Request request = new Request.Builder().url(url).post(formBody).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onsuccessjsonStringMethod(response.body().string(), callBack);
}
}
});
}
//下载图片
public void LoadImage(String url, final Func2 callBack){
Request request = new Request.Builder().url(url).build();
mClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response != null && response.isSuccessful()) {
onsuccessjsonStringMethod(response.body().bytes(),callBack);
}
}
});
}
}