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