OKHTTP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OKHTTP相关的知识,希望对你有一定的参考价值。

/**
* Created by peiyan on 2017/9/6.
* okhttp的中级封装,实现两个功能:
* 1.从服务端下载数据;
* 2.从客户端提交数据;
* 1.节约内存,使所有的网络请求都用一个okhttpclient和handler对象
* 2.解决okhttp,网络请求成功,代码在子线程的问题,把请求成功后的逻辑代码放到主线程中执行
* 3.简化代码
* <p>
* <p>
* 封装用到的知识点
* 1.单例模式 2.handler 3.接口 4.okhttp
*/

public class OKhttpManager {
//////////////////////////定义成员变量/////////////////////////////////////
private OkHttpClient mClient;
private static Handler mHandler;
private volatile static OKhttpManager sManager;//防止多个线程同时访问(使用volatile)

//////////////////////////使用构造方法,完成初始化///////////////////////////
//在使用单例模式的时候,构造方法一般为私有的,这样保证了对象的唯一性
// (EventBus,源码里面,他的构造方法是public,所以一方面可以通过单例模式拿到对象,另一方面
// 可以通过new对象拿到对象)
private OKhttpManager() {
mClient = new OkHttpClient();
mHandler = new Handler();
}
///////////////////////////////使用单例模式,通过获取的方式拿到对象//////////
public static OKhttpManager getInstance() {
OKhttpManager instance = null;
if (sManager == null) {
synchronized (OKhttpManager.class) {
if (instance == null) {
instance = new OKhttpManager();
sManager = instance;
}
}
}
return sManager;//这里如果是intance的话会报一个非法状态异常
}

//////////////////////////////// 定义接口////////////////////////////////////
interface Func1 {
void onResponse(String result);
}

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方法,把数据放到主线程中,以后还可以用EventBus或者RXjava的线程调度器去完成
mHandler.post(new Runnable() {
@Override
public void run() {
if (callBack != null) {
try {
callBack.onResponse(jsonValue);
} catch (Exception e) {
e.printStackTrace();
}

}
}
});
}

private static void OnSuccessBitmap(final byte[] bytes, final Func2 callBack) {
//这里我用的是mHandler.post方法,把数据放到主线程中,以后还可以用EventBus或者RXjava的线程调度器去完成
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) {

final 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 sendComplexForm(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 request_boby = form_builder.build();
Request request = new Request.Builder().url(url).post(request_boby).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 xiazai(String url, final Func2 calssBack) {

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()) {
OnSuccessBitmap(response.body().bytes(), calssBack);
}
}
});

}


}
下面是我对自己封装的一个测试:
一:获取字符串
[java] view plain copy
/**
* 通过点击事件执行okhttp里封装的根据网址,获取字符串的逻辑操作.
* @param view
*/
public void okhttp_json(View view) {
mOKhttpManager.asyncJsonStringByURL(json_path, new OKhttpManager.Func1() {
@Override
public void onResponse(String result) {
mText.setText(result);
}
});

}

二:获取下载图片:
[java] view plain copy
//下载图片
public void okhttp_picture(View view) {
mOKhttpManager.xiazai(Picture_path, new OKhttpManager.Func2() {
@Override
public void onResponse(byte[] result) {
final Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
mImageView.setImageBitmap(bitmap);
}
});



}

以上是关于OKHTTP的主要内容,如果未能解决你的问题,请参考以下文章

OkHttpOkHttp 源码分析 ( OkHttpClient.Builder 构造器源码分析 )

Android 普通okhttpokhttp utils执行 post get请求,文件上传下载请求图片

OkHttpOkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

OkHttpOkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )

OkHttpOkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )

面试官:简单说下 okHttp原理分析~