OkHttpUtils的封装
来源:互联网 发布:2016熊片数据库 编辑:程序博客网 时间:2024/05/18 06:20
OKHttpUtils
public class OkhttpUtils {
private static OkhttpUtils sOkHttpManager;
/** * okhttpclient实例 */private OkHttpClient mClient;/** * 因为我们请求数据一般都是子线程中请求,在这里我们使用了handler */private Handler mHandler;/** * 构造方法 */public OkhttpUtils() { mClient = new OkHttpClient(); /** * 在这里直接设置连接超时.读取超时,写入超时 */ mClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS); mClient.newBuilder().readTimeout(10, TimeUnit.SECONDS); mClient.newBuilder().writeTimeout(10, TimeUnit.SECONDS); /** * 如果是用的3.0之前的版本 使用以下直接设置连接超时.读取超时,写入超时 */ //client.setConnectTimeout(10, TimeUnit.SECONDS); //client.setWriteTimeout(10, TimeUnit.SECONDS); //client.setReadTimeout(30, TimeUnit.SECONDS); /** * 初始化handler */ mHandler = new Handler(Looper.getMainLooper());}/** * 单例模式 获取OkHttp实例 * * @return */public static OkhttpUtils getInstance() { if (sOkHttpManager == null) { sOkHttpManager = new OkhttpUtils(); } return sOkHttpManager;}//-------------------------同步的方式请求数据--------------------------/** * 对外提供的get方法,同步的方式 * * @param url 传入的地址 * @return */public static Response getSync(String url) { //通过获取到的实例来调用内部方法 return sOkHttpManager.inner_getSync(url);}/** * GET方式请求的内部逻辑处理方式,同步的方式 * * @param url * @return */private Response inner_getSync(String url) { Request request = new Request.Builder().url(url).build(); Response response = null; try { //同步请求返回的是response对象 response = mClient.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } return response;}/** * 对外提供的同步获取String的方法 * * @param url * @return */public static String getSyncString(String url) { return sOkHttpManager.inner_getSyncString(url);}/** * 同步方法 */private String inner_getSyncString(String url) { String result = null; try { /** * 把取得到的结果转为字符串,这里最好用string() */ result = inner_getSync(url).body().string(); } catch (IOException e) { e.printStackTrace(); } return result;}//-------------------------异步的方式请求数据--------------------------public static void getAsync(String url, DataCallBack callBack) { getInstance().inner_getAsync(url, callBack);}/** * 内部逻辑请求的方法 * * @param url * @param callBack * @return */private void inner_getAsync(String url, final DataCallBack callBack) { final Request request = new Request.Builder().url(url).build(); mClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { deliverDataFailure(request, e, callBack); } @Override public void onResponse(Call call, Response response) throws IOException { String result = null; try { result = response.body().string(); } catch (IOException e) { deliverDataFailure(request, e, callBack); } deliverDataSuccess(result, callBack); } });}/** * 分发失败的时候调用 * * @param request * @param e * @param callBack */private void deliverDataFailure(final Request request, final IOException e, final DataCallBack callBack) { /** * 在这里使用异步处理 */ mHandler.post(new Runnable() { @Override public void run() { if (callBack != null) { callBack.requestFailure(request, e); } } });}/** * 分发成功的时候调用 * * @param result * @param callBack */private void deliverDataSuccess(final String result, final DataCallBack callBack) { /** * 在这里使用异步线程处理 */ mHandler.post(new Runnable() { @Override public void run() { if (callBack != null) { try { callBack.requestSuccess(result); } catch (Exception e) { e.printStackTrace(); } } } });}/** * 数据回调接口 */public interface DataCallBack { void requestFailure(Request request, IOException e); void requestSuccess(String result) throws Exception;}//-------------------------提交表单--------------------------public static void postAsync(String url, Map<String, String> params, DataCallBack callBack) { getInstance().inner_postAsync(url, params, callBack);}private void inner_postAsync(String url, Map<String, String> params, final DataCallBack callBack) { RequestBody requestBody = null; if (params == null) { params = new HashMap<>(); } /** * 如果是3.0之前版本的,构建表单数据是下面的一句 */ //FormEncodingBuilder builder = new FormEncodingBuilder(); /** * 3.0之后版本 */ FormBody.Builder builder = new FormBody.Builder(); /** * 在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找 */ for (Map.Entry<String, String> map : params.entrySet()) { String key = map.getKey().toString(); String value = null; /** * 判断值是否是空的 */ if (map.getValue() == null) { value = ""; } else { value = map.getValue(); } /** * 把key和value添加到formbody中 */ builder.add(key, value); } requestBody = builder.build(); //结果返回 // 请求对象 final Request request = new Request.Builder().url(url).post(requestBody).build(); mClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { deliverDataFailure(request, e, callBack); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); deliverDataSuccess(result, callBack); } });}//-------------------------文件下载--------------------------public static void downloadAsync(String url, String desDir, DataCallBack callBack) { getInstance().inner_downloadAsync(url, desDir, callBack);}/** * 下载文件的内部逻辑处理类 * * @param url 下载地址 * @param desDir 目标地址 * @param callBack */private void inner_downloadAsync(final String url, final String desDir, final DataCallBack callBack) { final Request request = new Request.Builder().url(url).build(); mClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { deliverDataFailure(request, e, callBack); } @Override public void onResponse(Call call, Response response) throws IOException { /** * 在这里进行文件的下载处理 */ InputStream inputStream = null; FileOutputStream fileOutputStream = null; try { //文件名和目标地址 File file = new File(desDir, getFileName(url)); //把请求回来的response对象装换为字节流 inputStream = response.body().byteStream(); fileOutputStream = new FileOutputStream(file); int len = 0; byte[] bytes = new byte[2048]; //循环读取数据 while ((len = inputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, len); } //关闭文件输出流 fileOutputStream.flush(); //调用分发数据成功的方法 deliverDataSuccess(file.getAbsolutePath(), callBack); } catch (IOException e) { //如果失败,调用此方法 deliverDataFailure(request, e, callBack); e.printStackTrace(); } finally { if (inputStream != null) { inputStream.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } } } });}/** * 根据文件url获取文件的路径名字 * * @param url * @return */private String getFileName(String url) { int separatorIndex = url.lastIndexOf("/"); String path = (separatorIndex < 0) ? url : url.substring(separatorIndex + 1, url.length()); return path;}
}
Okhttp3Utils
public class OkHttp3Utils {
private static OkHttpClient okHttpClient = null;public OkHttp3Utils() {}private static OkHttpClient getOkHttpClient() { synchronized (OkHttp3Utils.class) { if (okHttpClient == null) { okHttpClient = new OkHttpClient(); } } return okHttpClient;}//上传文件public static void loadFile(String url, File file,String fileName){ OkHttpClient okHttpClient = getOkHttpClient(); //设置文件类型 RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"),file); //设置请求体 RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("image",fileName,requestBody) .build(); //请求方式 Request request = new Request.Builder().url(url).post(body).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i("成功","成功"); } });}/** * 1.接口地址 * 2.接口回调 */public static void doGet(String url,Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(callback);}/** * 1.地址 * 2.接口回调 * 3.请求体 */public static void doPost(String url, Map<String,String> map,Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); FormBody.Builder builder = new FormBody.Builder(); //遍历map集合 设置请求体 for (String mapKey : map.keySet()){ builder.add(mapKey,map.get(mapKey)); } //设置请求方式 Request request = new Request.Builder().url(url).post(builder.build()).build(); //执行请求方式 接口回调 okHttpClient.newCall(request).enqueue(callback);}/** *1.下载地址 */public static void doDown(String url,Callback callback){ OkHttpClient okHttpClient = getOkHttpClient(); Request build = new Request.Builder().url(url).build(); okHttpClient.newCall(build).enqueue(callback);}
}
OkHttp3LUtils
public class OkHttp3LUtils {
private static OkHttpClient okHttpClient;
//私有化的构造器
private OkHttp3LUtils(){}
public static OkHttpClient getInstance()
{
if(okHttpClient==null)
{
synchronized (OkHttp3LUtils.class)
{
//缓存的目录
File sd_cache=new File(Environment.getExternalStorageDirectory(),”ok_cache”);
//缓存存储的大小
int cacheSize=1024*1024*10;
//OkHttp3拦截器
HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i(“xxx”, message.toString());
}
});
//OkHttp3的拦截器日志分类 4种
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClient=new OkHttpClient.Builder() .addInterceptor(interceptor) .writeTimeout(30, TimeUnit.SECONDS) .readTimeout(30,TimeUnit.SECONDS) .connectTimeout(60,TimeUnit.SECONDS) .cache(new Cache(sd_cache,cacheSize)) .build(); } } return okHttpClient;}//get请求public static void doGet(String url, Callback callback){ OkHttpClient okHttpClient=getInstance(); //创建Request Request request=new Request.Builder() .url(url) .addHeader("User-Agent","") .build(); Call call=okHttpClient.newCall(request); call.enqueue(callback);}//post请求public static void doPost(String url, Map<String, String> params, Callback callback){ OkHttpClient okHttpClient=getInstance(); FormBody.Builder builder=new FormBody.Builder(); for(String key:params.keySet()) { builder.add(key,params.get(key)); } Request request=new Request.Builder() .post(builder.build()) .url(url) .build(); Call call=okHttpClient.newCall(request); call.enqueue(callback);}
}
- OkHttpUtils进一步的封装
- OkHttpUtils的封装
- OkHTTPUTILS的封装
- 已封装了的OkHttpUtils
- okhttputils封装
- OkHttpUtils - 封装了okhttp的网络框架
- OkHttpUtils - 封装了okhttp的网络框架
- OkHttpUtils - 封装了okhttp的网络框架
- OkHttpUtils - 封装了okhttp的网络框架
- 超简单的okHttpUtils封装(下)
- okhttpUtils的简单使用以及封装
- 封装封装OkHttpUtils
- Okhttputils终极封装
- 简单okHttpUtils封装
- 鸿洋大神封装的okhttputils拿走不谢!
- 基于OkHttpUtils网络请求的二次封装(简单版)
- OkHttpUtils已封装好的工具类+依赖,直接使用
- NetCallBack 泛型封装 + okhttputils封装
- ZooKeeper基础与集群搭建资料汇总
- C++运算符重载
- Tensorflow深入mnist程序整理
- XRecyclerView多布局2
- 虚拟机连不上网,ping时报错,connect network is unreachable
- OkHttpUtils的封装
- 关于安装版JDK1.8 1.7更改JDK环境变量不生效的解决方法
- 云服务器和VPS以及虚拟机有什么区别?个人站长和中小企业如何选择才适合自己?
- 升级到ionic3后建立低版本项目
- 关于Base64编码
- js人数递增
- 一文读懂深度学习与机器学习的差异
- Java并发工具类之CyclicBarrier
- 一个前端妹子的悲欢编程之路