MVC模式中Okhttp的使用
首先封装Okhttp
添加Okhttp依赖、log拦截器依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.1'//okhttp依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'// log拦截器依赖
封装utils
public class OkhttpUtils {
private static final long time = 60 * 1000;//常量
private Handler handler = new Handler();//在主线程中回调
private OkHttpClient client;//client对象
private OkhttpUtils() {
//设置拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
//设置级别打印所有
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//TODO:单例创建client
client = new OkHttpClient.Builder()
.writeTimeout(time, TimeUnit.MILLISECONDS)
.readTimeout(time, TimeUnit.MILLISECONDS)
.connectTimeout(time, TimeUnit.MILLISECONDS)
.build();
}
private static OkhttpUtils okhttpUtils = null;
//双重校验锁 单例模式
public static OkhttpUtils getInstance() {
if (okhttpUtils == null) {
synchronized (String.class) {
if (okhttpUtils == null) {
okhttpUtils = new OkhttpUtils();
}
}
}
return okhttpUtils;
}
/**
* get请求json数据
*
* @param url 网络接口
* @param myOkhttpCallBack 接口返回数据
*/
public void doGet(String url, final MyOkhttpCallBack myOkhttpCallBack) {
Request request = new Request.Builder()
.url(url)
.get()
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
//子线程
handler.post(new Runnable() {
@Override
public void run() {
//主线程
if (myOkhttpCallBack != null) {
myOkhttpCallBack.onError(message);
}
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String json = response.body().string();
//子线程
handler.post(new Runnable() {
@Override
public void run() {
//主线程
if (myOkhttpCallBack != null) {
myOkhttpCallBack.onOk(json);
}
}
});
}
});
}
/**
* post请求 做登录,注册
*
* @param url 网址接口
* @param map 提供requestBody数据集合
* @param myOkhttpCallBack 返回接口数据
*/
public void doPost(String url,final HashMap<String, String> map, final MyOkhttpCallBack myOkhttpCallBack) {
//获取builder对象
FormBody.Builder builder = new FormBody.Builder();
//遍历map集合:获得键直对的集合 遍历键直对集合分别获得键和值
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry :
entries) {
builder.add(entry.getKey(),entry.getValue());
}
FormBody formBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
handler.post(new Runnable() {
@Override
public void run() {
if (myOkhttpCallBack != null) {
myOkhttpCallBack.onError(message);
}
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String json = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
if (myOkhttpCallBack!=null){
myOkhttpCallBack.onOk(json);
}
}
});
}
});
}
/**
* 网络下载数据
* @param url
* @param filePath
* @param myOkhttpCallBack
*/
public void downLoad(String url, final String filePath,final MyOkhttpCallBack myOkhttpCallBack){
Request request = new Request.Builder()
.url(url)
.get()
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
final String message = e.getMessage();
handler.post(new Runnable() {
@Override
public void run() {
if (myOkhttpCallBack != null) {
myOkhttpCallBack.onError(message);
}
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
ResponseBody body = response.body();
InputStream inputStream = body.byteStream();//字节流
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
byte[] bytes = new byte[1024];
int len = 0;
int count = 0;//下载大小
while ((len = inputStream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
}
});
}
}
封装时做的接口回调:
public interface MyOkhttpCallBack {
void onOk(String json);//成功
void onError(String message);//失败
}
Model层
实现接口
public interface UserMode {
void getjson(String url, MyOkhttpCallBack myOkhttpCallBack);//获取网络json
void loginOrRegister(String url, HashMap<String, String> map,MyOkhttpCallBack myOkhttpCallBack);//登录 或 注册方法
void downLoad(String url, final String filePath, MyOkhttpCallBack myOkhttpCallBack);//网络请求数据
}
实现子类
public class UserModeImpl implements UserMode {
@Override
public void getjson(String url,MyOkhttpCallBack myOkhttpCallBack) {
OkhttpUtils.getInstance().doGet(url,myOkhttpCallBack);
}
@Override
public void loginOrRegister(String url, final HashMap<String, String> map,MyOkhttpCallBack myOkhttpCallBack) {
OkhttpUtils.getInstance().doPost(url, map,myOkhttpCallBack);
}
@Override
public void downLoad(String url, String filePath, MyOkhttpCallBack myOkhttpCallBack) {
OkhttpUtils.getInstance().downLoad(url,filePath,myOkhttpCallBack);
}
}