分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

OKHTTP

发布时间:2023-09-06 01:16责任编辑:蔡小小关键词:暂无标签

/**
* 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

原文地址:http://www.cnblogs.com/wang-chunqi/p/7635391.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved