🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
***** **封装网络框架** [TOC=6] # 1. 常见设计模式 1. 单例模式 **** 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点 **懒汉式** ~~~ public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() {} /* 1:懒汉式,静态工程方法,创建实例 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ~~~ **饿汉式** ~~~ public class Singleton { private final static Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return INSTANCE; } } ~~~ 2. 工厂模式 基本概念:为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 3. 建造(Builder)模式 基本概念:是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 4. 观察者模式 基本概念:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式又叫发布-订阅(Publish/Subscribe)模式。 5. 适配器(Adapter)模式 基本概念:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 # 2. 线程池的使用 **** 好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配、调优和监控,有以下好处: 1、降低资源消耗; 2、提高响应速度; 3、提高线程的可管理性。 Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行、被哪个线程执行,以及什么时候执行。 **** newSingleThreadExecutor:产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。 newCachedThreadPool():产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。 newFixedThreadPool(int poolSize):产生一个ExecutorService对象,这个对象带有一个大小为poolSize的线程池,若任务数量大于poolSize,任务会被放在一个queue里顺序执行。 newSingleThreadScheduledExecutor:产生一个ScheduledExecutorService对象,这个对象的线程池大小为1,若任务多于一个,任务将按先后顺序执行。 newScheduledThreadPool(int poolSize):产生一个ScheduledExecutorService对象,这个对象的线程池大小为poolSize,若任务数量大于poolSize,任务会在一个queue里等待执行。 # 3. 使用单例模式封装网络框架 ~~~ public class HttpUtils { //线程池 private static ExecutorService executor; private static Handler mHandler; static { executor = Executors.newFixedThreadPool(5); mHandler = new Handler(); } /** * 执行网络请求操作,返回数据会解析成字符串String * * @param method 请求方式(需要传入String类型的参数:"GET","POST") * @param url 请求的url * @param params 请求的参数 */ public static String doHttpReqeust(final String method, final String url, final Map<String, String> params, final StringCallback callback) { executor.execute(new Runnable() { @Override public void run() { HttpURLConnection connection = null; OutputStream outputStream = null; try { URL u = new URL(url); connection = (HttpURLConnection) u.openConnection(); // 设置输入可用 connection.setDoInput(true); // 设置输出可用 connection.setDoOutput(true); // 设置请求方式 connection.setRequestMethod(method); // 设置连接超时 connection.setConnectTimeout(5000); // 设置读取超时 connection.setReadTimeout(5000); // 设置缓存不可用 connection.setUseCaches(false); // 开始连接 connection.connect(); // 只有当POST请求时才会执行此代码段 if (params != null) { // 获取输出流,connection.getOutputStream已经包含了connect方法的调用 outputStream = connection.getOutputStream(); StringBuilder sb = new StringBuilder(); Set<Map.Entry<String, String>> sets = params.entrySet(); // 将Hashmap转换为string for (Map.Entry<String, String> entry : sets) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String param = sb.substring(0, sb.length() - 1); // 使用输出流将string类型的参数写到服务器 outputStream.write(param.getBytes()); outputStream.flush(); } int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); String result = inputStream2String(inputStream); if (result != null && callback != null) { postSuccessString(callback, result); } } else { if (callback != null) { postFailed(callback, responseCode, new Exception("请求数据失败:" + responseCode)); } } } catch (final Exception e) { e.printStackTrace(); if (callback != null) { postFailed(callback, 0, e); } } finally { if (connection != null) { connection.disconnect(); } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }); return null; } /** * 执行网络请求操作,返回数据是Bitmap * * @param method 请求方式(需要传入String类型的参数:"GET","POST") * @param url 请求的url * @param params 请求的参数 */ public static String doHttpReqeust(final String method, final String url, final Map<String, String> params, final BitmapCallback callback) { executor.execute(new Runnable() { @Override public void run() { HttpURLConnection connection = null; OutputStream outputStream = null; InputStream inputStream = null; try { URL u = new URL(url); connection = (HttpURLConnection) u.openConnection(); // 设置输入可用 connection.setDoInput(true); // 设置输出可用 connection.setDoOutput(true); // 设置请求方式 connection.setRequestMethod(method); // 设置连接超时 connection.setConnectTimeout(5000); // 设置读取超时 connection.setReadTimeout(5000); // 设置缓存不可用 connection.setUseCaches(false); // 开始连接 connection.connect(); // 只有当POST请求时才会执行此代码段 if (params != null) { // 获取输出流,connection.getOutputStream已经包含了connect方法的调用 outputStream = connection.getOutputStream(); StringBuilder sb = new StringBuilder(); Set<Map.Entry<String, String>> sets = params.entrySet(); // 将Hashmap转换为string for (Map.Entry<String, String> entry : sets) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String param = sb.substring(0, sb.length() - 1); // 使用输出流将string类型的参数写到服务器 outputStream.write(param.getBytes()); outputStream.flush(); } int responseCode = connection.getResponseCode(); if (responseCode == 200) { inputStream = connection.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); if (bitmap != null && callback != null) { postSuccessBitmap(callback, bitmap); } } else { if (callback != null) { postFailed(callback, responseCode, new Exception("请求图片失败:" + responseCode)); } } } catch (final Exception e) { e.printStackTrace(); if (callback != null) { postFailed(callback, 0, e); } } finally { if (connection != null) { connection.disconnect(); } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }); return null; } /** * 执行网络请求操作,返回数据是byte[] * * @param method 请求方式(需要传入String类型的参数:"GET","POST") * @param url 请求的url * @param params 请求的参数 */ public static String doHttpReqeust(final String method, final String url, final Map<String, String> params, final ByteArrayCallback callback) { executor.execute(new Runnable() { @Override public void run() { HttpURLConnection connection = null; OutputStream outputStream = null; try { URL u = new URL(url); connection = (HttpURLConnection) u.openConnection(); // 设置输入可用 connection.setDoInput(true); // 设置输出可用 connection.setDoOutput(true); // 设置请求方式 connection.setRequestMethod(method); // 设置连接超时 connection.setConnectTimeout(5000); // 设置读取超时 connection.setReadTimeout(5000); // 设置缓存不可用 connection.setUseCaches(false); // 开始连接 connection.connect(); // 只有当POST请求时才会执行此代码段 if (params != null) { // 获取输出流,connection.getOutputStream已经包含了connect方法的调用 outputStream = connection.getOutputStream(); StringBuilder sb = new StringBuilder(); Set<Map.Entry<String, String>> sets = params.entrySet(); // 将Hashmap转换为string for (Map.Entry<String, String> entry : sets) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String param = sb.substring(0, sb.length() - 1); // 使用输出流将string类型的参数写到服务器 outputStream.write(param.getBytes()); outputStream.flush(); } int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); byte[] bytes = inputStream2ByteArray(inputStream); if (bytes != null && callback != null) { postSuccessByte(callback, bytes); } } else { if (callback != null) { postFailed(callback, responseCode, new Exception("请求图片失败:" + responseCode)); } } } catch (final Exception e) { e.printStackTrace(); if (callback != null) { postFailed(callback, 0, e); } } finally { if (connection != null) { connection.disconnect(); } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }); return null; } /** * 执行网络请求操作,返回数据是对象 * * @param method 请求方式(需要传入String类型的参数:"GET","POST") * @param url 请求的url * @param params 请求的参数 */ public static <T> void doHttpReqeust(final String method, final String url, final Map<String, String> params, final Class<T> cls, final ObjectCallback callback) { executor.execute(new Runnable() { @Override public void run() { HttpURLConnection connection = null; OutputStream outputStream = null; try { URL u = new URL(url); connection = (HttpURLConnection) u.openConnection(); // 设置输入可用 connection.setDoInput(true); // 设置输出可用 connection.setDoOutput(true); // 设置请求方式 connection.setRequestMethod(method); // 设置连接超时 connection.setConnectTimeout(5000); // 设置读取超时 connection.setReadTimeout(5000); // 设置缓存不可用 connection.setUseCaches(false); // 开始连接 connection.connect(); // 只有当POST请求时才会执行此代码段 if (params != null) { // 获取输出流,connection.getOutputStream已经包含了connect方法的调用 outputStream = connection.getOutputStream(); StringBuilder sb = new StringBuilder(); Set<Map.Entry<String, String>> sets = params.entrySet(); // 将Hashmap转换为string for (Map.Entry<String, String> entry : sets) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } String param = sb.substring(0, sb.length() - 1); // 使用输出流将string类型的参数写到服务器 outputStream.write(param.getBytes()); outputStream.flush(); } int responseCode = connection.getResponseCode(); if (responseCode == 200) { InputStream inputStream = connection.getInputStream(); String result = inputStream2String(inputStream); if (result != null && callback != null) { postSuccessObject(callback, new Gson().fromJson(result, cls)); } } else { if (callback != null) { postFailed(callback, responseCode, new Exception("请求数据失败:" + responseCode)); } } } catch (final Exception e) { e.printStackTrace(); if (callback != null) { postFailed(callback, 0, e); } } finally { if (connection != null) { connection.disconnect(); } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }); } private static void postSuccessString(final StringCallback callback, final String result) { mHandler.post(new Runnable() { @Override public void run() { callback.onSuccess(result); } }); } private static void postSuccessBitmap(final Callback callback, final Bitmap bitmap) { mHandler.post(new Runnable() { @Override public void run() { BitmapCallback bitmapCallback = (BitmapCallback) callback; bitmapCallback.onSuccess(bitmap); } }); } private static void postSuccessByte(final Callback callback, final byte[] bytes) { mHandler.post(new Runnable() { @Override public void run() { ByteArrayCallback byteArrayCallback = (ByteArrayCallback) callback; byteArrayCallback.onSuccess(bytes); } }); } private static <T> void postSuccessObject(final ObjectCallback callback, final T t) { mHandler.post(new Runnable() { @Override public void run() { ObjectCallback objectCallback = (ObjectCallback) callback; objectCallback.onSuccess(t); } }); } private static void postFailed(final Callback callback, final int code, final Exception e) { mHandler.post(new Runnable() { @Override public void run() { callback.onFaileure(code, e); } }); } /** * 字节流转换成字符串 * * @param inputStream * @return */ private static String inputStream2String(InputStream inputStream) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int len = 0; try { while ((len = inputStream.read(bytes)) != -1) { baos.write(bytes, 0, len); } return new String(baos.toByteArray()); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (baos != null) { try { baos.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 字节流转换成字节数组 * * @param inputStream 输入流 * @return */ public static byte[] inputStream2ByteArray(InputStream inputStream) { byte[] result = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 缓冲区 byte[] bytes = new byte[1024]; int len = -1; try { // 使用字节数据输出流来保存数据 while ((len = inputStream.read(bytes)) != -1) { outputStream.write(bytes, 0, len); } result = outputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 判断是否联网 * * @param context * @return */ public static boolean isNetWorkConnected(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null) { return networkInfo.isAvailable(); } return false; } public interface Callback { void onFaileure(int code, Exception e); } public interface StringCallback extends Callback { void onSuccess(String result); } public interface BitmapCallback extends Callback { void onSuccess(Bitmap bitmap); } public interface ByteArrayCallback extends Callback { void onSuccess(byte[] bytes); } public interface ObjectCallback<T> extends Callback { void onSuccess(T t); } } ~~~