<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ***** **封裝網絡框架** [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); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看