OKHttp封装
来源:互联网 发布:windows xp硬盘安装版 编辑:程序博客网 时间:2024/05/18 03:08
下面是出自本人之手的一个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); } } }); }}下面是我对自己封装的一个测试:
一:获取字符串
/** * 通过点击事件执行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); } }); }
二:获取下载图片:
//下载图片 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); } }); }
阅读全文
1 0
- okhttp封装okhttp-utils
- 封装OKHttp
- 封装OkHttp
- okhttp封装
- 封装OKHttp
- 封装OKHttp
- Okhttp封装
- OkHttp 封装
- OkHttp封装
- OKHttp封装
- Okhttp封装
- okHttp封装
- OkHttp封装
- Okhttp封装
- 封装okhttp
- okhttp封装
- 封装okhttp
- Okhttp封装
- ABAP的DBCO、ADBC相关DEMO
- Linux基础命令学习笔记~2
- EditText中inputType使用
- 线程 Thread Runnable start run
- Streaming 101批处理之外的流处理世界
- OKHttp封装
- SpringBoot-创建自己的starter和autoconfiguration
- HDU
- 程序27
- 界面库
- Android 第三方轮播图控件ConvenientBanner:通用的广告栏控件
- 服务器Socket概述与实例
- JavaScript移动
- 什么是原子操作?Linux下有哪些原子操作API