线程间通讯
解決ANR問題:
子線程:進行耗時操作
? ? ? ? ? ? |
?Handle(將子線程耗時的結果,傳遞到主線程)
主線程:進行控件更新
Handle
實現步驟
1.獲得Hand對象
Handler?handler=new?Handler();
2.通過handler.sendMessage()將子線程中的數據傳遞到主線程更新
3.在HandleMessage()中獲得子線程耗時下載的結果 ,更新數據到控件
msg.what=2;//區分哪個子線程傳遞數據給主線程
//從消息池中獲取message對象 ?性能上優化
?Message?msg?=?handler.obtainMessage();
handler.sendEmptyMessage(what);//發送空消息
// handler.sendMessageDelayed(msg,?4000);//延遲一段時間后再發送消息
Message?message?=?handler.obtainMessage(1,?1,?2,?str);//封裝消息
handler.sendMessage(message);
簡單更新控件的方法
1.RunOnUIThread()
2.非空的View handle 都有?post();
3.非空的View handle 都有?postDelayed(action,time);延遲一段時間后在執行run()
練習:
progressBar自動更新進度 ? ?子線程中更新控件
AyncTask (異步任務)
優點:使用方便 要求低
缺點:步驟多
String...?params : 可變參數 ? 沒有使用的參數 Void表示
實現步驟:?
1.創建一個類繼承AsyncTask<String,?Void,?String> ?參數:泛型
第一個參數:決定了doInBackground()的傳入參數類型 ??
?下載網址??
第二個參數:決定publishProgress();onProgressUpdate ()傳入參數類型名
第三個參數:決定doInBackground()返回值類型
? ? ? ? ? ? ? ? ? ?onPostExecute的傳入參數類型 ?
2.重寫doInBackground//進行耗時操作 ??執行在子線程 ??返回耗時結果
3.重寫onPostExecute ?獲得耗時結果 ??進行控件更新 ? ?執行在主線程
4.推送中間進度 ?
5.重寫onProgressUpdate()接收中間進度
6.重寫onPreExecute()執行再doInbackground()之前
7.啟動異步任務
啟動異步任務流程
1.啟動異步任務
啟動異步任務下載圖片
注意:添加網絡權限
<uses-permission?android:name="android.permission.INTERNET"/>
轉載于:https://blog.51cto.com/1206995290qq/1830802
總結
- 上一篇: 【python】一个简单的贪婪爬虫
- 下一篇: Ubuntu14.04安装apt-get