NoHttp封裝--07 自定義非同步任務框架

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/05/14/9038801.html
-Advertisement-
Play Games

MainActivity: NetworkInterface: MultiAsynctaskNetwork: 核心類MultiAsynctask: ...


MainActivity:

 1 public class MainActivity extends Activity implements View.OnClickListener {
 2 
 3     ....
 4 
 5     @Override
 6     public void onClick(View v) {
 7         MultiAsynctaskNetwork network = new MultiAsynctaskNetwork(networkInterface);
 8         network.execute();
 9     }
10 
11     private NetworkInterface networkInterface = new NetworkInterface() {
12         @Override
13         public void onResult(String result) {
14             mTvResult.setText(result);
15         }
16     };
17 
18 }

NetworkInterface:

1 public interface NetworkInterface {
2 
3     void onResult(String result);
4 
5 }

MultiAsynctaskNetwork:

 1 public class MultiAsynctaskNetwork extends MultiAsynctask<Void, Integer, String> {
 2 
 3     private NetworkInterface mInterface;
 4 
 5     public MultiAsynctaskNetwork(NetworkInterface networkInterface) {
 6         this.mInterface = networkInterface;
 7     }
 8 
 9     @Override
10     protected String onExecuteTask(Void... params) {
11         HttpURLConnection connection = null;
12         try {
13             URL url = new URL("http://blog.csdn.net/yanzhenjie1003");
14             connection = (HttpURLConnection) url.openConnection();
15             int responseCode = connection.getResponseCode();
16             if (responseCode == 200) {
17                 int len = 0;
18                 byte[] buffer = new byte[1024];
19                 ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
20                 InputStream inputStream = new BufferedInputStream(connection.getInputStream());
21                 while ((len = inputStream.read(buffer)) != -1) {
22                     arrayOutputStream.write(buffer, 0, len);
23                 }
24                 inputStream.close();
25                 arrayOutputStream.flush();
26                 inputStream.close();
27                 return new String(arrayOutputStream.toByteArray());
28             }
29         } catch (Exception e) {
30             e.printStackTrace();
31         } finally {
32             if (connection != null)
33                 connection.disconnect();
34         }
35         return "請求網路失敗";
36     }
37 
38     @Override
39     public void onResult(String result) {// 拿到執行結果,直接更新UI
40         mInterface.onResult(result);
41     }
42 
43 }

核心類MultiAsynctask:

  1 public abstract class MultiAsynctask<Param, Update, Result> {
  2 
  3     /**
  4      * 更新的what
  5      */
  6     private static final int WHAT_UPDATE = 0x01;
  7 
  8     /**
  9      * 發送結果的what
 10      */
 11     private static final int WHAT_RESULT = 0x02;
 12 
 13     /**
 14      * 預設的線程池
 15      */
 16     private static ExecutorService sExecutorService;
 17 
 18     /**
 19      * 預設併發大小
 20      */
 21     private static final int DEFAULT_POOL_SIZE = 5;
 22 
 23     /**
 24      * 發送結果的Handler
 25      */
 26     private static Handler sHandler;
 27 
 28     /**
 29      * Handler的鎖
 30      */
 31     private static Object HANDLER_LOCK = new Object();
 32 
 33     /**
 34      * 本地非同步任務的執行器
 35      */
 36     private ExecutorService mExecutorService = null;
 37 
 38     public MultiAsynctask() {
 39         this(getDufaultExecutor());
 40     }
 41 
 42     public MultiAsynctask(ExecutorService executorService) {
 43         mExecutorService = executorService;
 44     }
 45 
 46     /**
 47      * 拿到預設的線程池
 48      * 
 49      * @return
 50      */
 51     private static ExecutorService getDufaultExecutor() {
 52         synchronized (MultiAsynctask.class) {
 53             if (sExecutorService == null)
 54                 sExecutorService = Executors.newFixedThreadPool(DEFAULT_POOL_SIZE);
 55             return sExecutorService;
 56         }
 57     }
 58 
 59     /**
 60      * 設置預設的線程池
 61      * 
 62      * @param executorService
 63      */
 64     public static void setDefaultExecutor(ExecutorService executorService) {
 65         synchronized (MultiAsynctask.class) {
 66             sExecutorService = executorService;
 67         }
 68     }
 69 
 70     public static Handler getDefaultPoster() {
 71         synchronized (HANDLER_LOCK) {
 72             if (sHandler == null)
 73                 sHandler = new Poster();
 74             return sHandler;
 75         }
 76     }
 77 
 78     /**
 79      * 開始執行任務
 80      * 
 81      * @param params
 82      */
 83     public final void execute(Param... params) {
 84         mExecutorService.execute(new Tasker(params));
 85     }
 86 
 87     protected abstract Result onExecuteTask(Param... params);
 88 
 89     /**
 90      * 發送進度更新到主線程
 91      * 
 92      * @param update
 93      */
 94     public final void onPostUpdate(Update update) {
 95         Message.obtain();
 96         Message message = getDefaultPoster().obtainMessage();
 97         message.what = WHAT_UPDATE;
 98         message.obj = new Messager<Param, Update, Result>(this, update, null);
 99         message.sendToTarget();
100     }
101 
102     /**
103      * 當返回進度更新的時候
104      * 
105      * @param update
106      */
107     protected void onUpdate(Update update) {
108     }
109 
110     /**
111      * 發送進度執行結果到主線程
112      * 
113      * @param result
114      */
115     public final void onPostResult(Result result) {
116         Message.obtain();
117         Message message = getDefaultPoster().obtainMessage();
118         message.what = WHAT_RESULT;
119         message.obj = new Messager<Param, Update, Result>(this, null, result);
120         message.sendToTarget();
121     }
122 
123     /**
124      * 當返回執行結果的時候
125      * 
126      * @param result
127      */
128     protected void onResult(Result result) {
129 
130     }
131 
132     private static class Messager<Param, Update, Result> {
133 
134         private final MultiAsynctask<Param, Update, Result> asynctask;
135 
136         private final Update update;
137 
138         private final Result result;
139 
140         public Messager(MultiAsynctask<Param, Update, Result> asynctask, Update update, Result result) {
141             this.asynctask = asynctask;
142             this.update = update;
143             this.result = result;
144         }
145 
146         /**
147          * 調用當前MultiAsynctask的主線程更新方法
148          */
149         public void onUpdate() {
150             asynctask.onUpdate(update);
151         }
152 
153         /**
154          * 調用當前MultiAsynctask的主線程結果方法
155          */
156         public void onResult() {
157             asynctask.onResult(result);
158         }
159 
160     }
161 
162     /**
163      * <p>
164      * 線程間通信使者
165      * </p>
166      * Created in Mar 27, 2016 10:00:03 PM.
167      * 
168      * @author Yolanda;
169      */
170     private static class Poster extends Handler {
171 
172         public Poster() {
173             super(Looper.getMainLooper());
174         }
175 
176         @Override
177         public void handleMessage(Message msg) {
178             Messager<?, ?, ?> messageer = (Messager<?, ?, ?>) msg.obj;
179             if (msg.what == WHAT_RESULT) {
180                 messageer.onResult();
181             } else if (msg.what == WHAT_UPDATE) {
182                 messageer.onUpdate();
183             }
184         }
185     }
186 
187     /**
188      * <p>
189      * 任務執行器
190      * </p>
191      * Created in Mar 27, 2016 10:03:44 PM.
192      * 
193      * @author Yolanda;
194      */
195     private class Tasker implements Runnable {
196 
197         private Param[] params;
198 
199         public Tasker(Param... params) {
200             this.params = params;
201         }
202 
203         @Override
204         public void run() {
205             Result result = onExecuteTask(params);
206             onPostResult(result);
207         }
208     }
209 
210 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查詢的基本語法 from關鍵字後面寫表名,表示數據來源於是這張表 select後面寫表中的列名,如果是*表示在結果中顯示表中所有列 在select後面的列名部分,可以使用as為列起別名,這個別名出現在結果集中 如果要查詢多個列,之間使用逗號分隔 消除重覆行 在select後面列前使用distinct ...
  • 1.大小寫轉換快捷鍵:Ctrl+Shift+U 轉為大寫 ,Ctrl+Shift+L 轉為小寫 ... ...
  • Oracle: create table zjhis.mz_zdxx_zl as select a.sfsb, wm_concat(a.zdmc) as 診斷 from zjhis.mz_zdxx a group by a.sfsb 直接可以使用 wm_concat 函數 SQl SERVER : ...
  • select * from(select row_number() over(partition by IDCARD order by DATATM desc) as rownum,* from (SELECT * FROM TABLENAME)as H1 ) as H where H.rownum ...
  • 一、在控制面板,卸載MySQL的所有組件 控制面板——》所有控制面板項——》程式和功能,卸載所有和MySQL有關的程式 二、找到你的MysQL安裝路徑,看還有沒有和MySQL有關的文件夾,全刪 如果安裝在C盤,檢查一下C:\Program Files (x86)和C:\Program Files 這 ...
  • 記得以前客戶在使用軟體時,有偶發出現死鎖問題,因為發生的時間不確定,不好做問題的重現,當時解決問題有點棘手了。 現總結下查看死鎖的常用二種方式: 第一種是圖形化監聽: sqlserver -->工具--> sql server profiler 登錄後在跟蹤屬性中選擇如下圖: 監聽到的死鎖圖形如下圖 ...
  • 一,增強現實 增強現實(AR)是一種實時地計算攝影機影像的位置及角度並加上相應圖像的技術,這種技術的目標是在屏幕上把虛擬世界套在現實世界併進行互動。這種技術估計由1990年提出。隨著隨身電子產品運算能力的提升,預期增強現實的用途將會越來越廣。 二,視頻捕獲 捕獲視頻的方法有兩個,一個方法是錄製視頻保 ...
  • 問題描述: 業務上初始化過程要求顯示閃屏界面,某個版本更新後,發現部分場景下,初始化完成後閃屏界面不消失。 問題原因: 初始化是在子線程進行,閃屏屬於UI界面,需要UI線程展示。初始化過程和閃屏顯示在不同線程,UI線程忙碌的時候,會出現業務的初始化已經執行完成,閃屏界面才真正顯示。 解決措施: 方案 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...