




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Android Handler 用法詳解Handler一Handler 是Android 中的消息發(fā)送器,在哪個 Activity 中創(chuàng)建就屬于該Activity。也可以說在哪個線new 定義出來,就屬于哪個線程的 Handler。Android UI 更新也是利用 Handler 來實現(xiàn)更新的。1.當應用程序啟動時,Android 會首先開啟一個主線程(也就是 UI 線程),主線程管理 UI 控件,進行事件觸發(fā),比如說:點擊一個 Button,Android 會把觸發(fā)事件分配到Button 上,響應你的操作。2.如果此時需要進行 1 個耗時的操作(比如說聯(lián)網(wǎng)數(shù)據(jù)或是文件),在 Android
2、 4.0 以后就必須創(chuàng)建 1 個子線程,在子線進行操作。如果在主線進行這個操作,界面會出現(xiàn)假死現(xiàn)象,5 秒內(nèi)還沒有完成的話,Android 系統(tǒng)會誤以為這個系統(tǒng)未響應,接著強制關閉該應用,同時用戶會收到一個“抱歉,XX 未響應,已強制關閉”的框(ANR 錯誤)。二Handler 的作用1.安排消息或 Runnable 在某個主線執(zhí)行2.安排 1 個動作在不同的線執(zhí)行handler 本身不僅可以發(fā)送信息,還可以用t 方法添加一個實現(xiàn) Runnable 接口的對象到消息隊列中,在目標受到消息后就以回調(diào)的方式在自己的線執(zhí)行run 方法。三Handler 的使用Handler 可以分發(fā)Message
3、對象和Runnable 對象到主線,每個 Handler 實例都會綁定到創(chuàng)建他的線(一般位于主線程)。1.創(chuàng)建 Handler,重寫 handleMessage 方法來處理消息Handler handler =new Handler()public void handleMessage(Message msg)super.handleMessage(msg);Switsg.what)case 0:/檢查版本號checkVer();break;/* 檢查服務器版本號與本地應用版本號是否一致*/private void checkVer() final long startTime=System.
4、currentTimeMillis();new Thread()Message msg=Message.obtain();Overridepublic void run() try URL url=new URL(getString(R.string.servierUrl);HttpURLConnection conn= (HttpURLConnection)url.openConnection();conn.setRequestMethod(GET);conn.setConnectTimeout(5000);conn.setReadTimeout(5000);code = conn.getR
5、esponseCode();if(200 = code)InputStream is = conn.getInputStream();String result = StreamTools.readFromStream(is);JSONObject obj=new JSONObject(result);String ver= (String) obj.get(ver);des= (String) obj.get(description);apkUrl= (String) obj.get(apkurl);if(getVerName().equals(ver)msg.what=ENTER_HOME
6、;elsemsg.what=SHOW_UPDATE_DIALOG;elsemsg.what=FAILD_ERROR; catch (MalformedURLException e) msg.what=URL_ERROR; catch (IOException e) msg.what=NET_ERRROR; catch (JSONException e) msg.what=JSON_ERROR;finally long endTime=System.currentTimeMillis();long dTime=endTime-startTime;/最后加上這句,可以延遲 2000-dTime 秒
7、將消息放入隊列,也可以用 sendMessage馬上將消息放入隊列if(dTime 2000)handler.sendEmptyMessageDelayed(msg.what,);elsehandler.sendEmptyMessageDelayed(msg.what,0);.start();2. 也可以自定義 1 個類, 繼承handleMessage(Message msg)方法Handler , 但同樣要實現(xiàn)class MyHandler extends Handlerpublic MyHandler ()public void handleMessage(Message msg)sup
8、er.handleMessage(msg);Switsg.what)case 0:/檢查版本號checkVer();break;/* 檢查服務器版本號與本地應用版本號是否一致*/private void checkVer() final long startTime=System.currentTimeMillis();new Thread()Message msg=Message.obtain();Overridepublic void run() try URL url=new URL(getString(R.string.servierUrl);HttpURLConnection con
9、n= (HttpURLConnection)url.openConnection();conn.setRequestMethod(GET);conn.setConnectTimeout(5000);conn.setReadTimeout(5000);code = conn.getResponseCode();if(200 = code)InputStream is = conn.getInputStream();String result = StreamTools.readFromStream(is);JSONObject obj=new JSONObject(result);String
10、ver= (String) obj.get(ver);des= (String) obj.get(description);apkUrl= (String) obj.get(apkurl);if(getVerName().equals(ver)msg.what=ENTER_HOME;elsemsg.what=SHOW_UPDATE_DIALOG;elsemsg.what=FAILD_ERROR; catch (MalformedURLException e) msg.what=URL_ERROR; catch (IOException e) msg.what=NET_ERRROR; catch
11、 (JSONException e) msg.what=JSON_ERROR;finally long endTime=System.currentTimeMillis();long dTime=endTime-startTime;/最后加上這句,可以延遲 2000-dTime 秒將消息放入隊列,也可以用 sendMessage馬上將消息放入隊列if(dTime 2000)handler.sendEmptyMessageDelayed(msg.what,);elsehandler.sendEmptyMessageDelayed(msg.what,0);.start();3.分發(fā) Message
12、 或 Runnable 對象到 Handler 所在的線般 Handler 在主線,一Handler 中分發(fā)消息的一些方法:t(Runnable) Time(Runnable,long)tDelayed(Runnable long) sendEmptyMessage( ) sendMessage(Message) sendMessageAtTime(Message,long)sendMessageDelayed(Message,long)Handler handler=new Handler();Handlost(new Runnable()Public void run()/do somet
13、hing;三其他1.向哪個 Handler 發(fā)送信息,就必須在哪個Handler 里面接受2.消息隊列有著先進先出的原則。3.在創(chuàng)建 Message 時,可以使用Message message=Message.obtain();來代替 Message message=new Message();從下面 2 個方法的代碼中可以看出,obtain()方法是從整個 Message 池中返回 1 個新的 Message 實例,因此它能避免創(chuàng)建新的對象,從而減少內(nèi)存的開銷。obtain()方法/* Return a new Message instance from the global pool. Allows us to* avoid allocating new objectsany cases.*/public sic Message obtain() synchronized (sPoolSync) if (sPool != null) Message m = sPool;sPool = m next;m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 主播兼職勞動合同范本
- 農(nóng)莊分包經(jīng)營合同范本
- 單位配送食材合同范本
- 勘察鉆機租賃合同范例
- 網(wǎng)頁設計復習題及答案
- 高壓電工(運行)模擬題含答案
- 一年級的數(shù)學上冊的期末試卷
- led鋼結構合同范本
- 《音樂巨人貝多芬》的教學反思
- 《迷彩服》的教案
- 護理文件書寫PDCA課件
- 2024年陜西省中考英語試卷附答案
- 江西省南昌市西湖區(qū)2023-2024學年五年級下學期期末數(shù)學試題
- 康復治療方案制定流程(2篇)
- 消化道出血診療規(guī)范2022版
- 陜西省民用建筑能耗監(jiān)測系統(tǒng)技術指南
- TD/T 1044-2014 生產(chǎn)項目土地復墾驗收規(guī)程(正式版)
- 商業(yè)道德承諾書
- 光伏電站巡檢記錄表完整
- 高血壓患者不遵醫(yī)飲食行為的原因分析及對策
- 《團隊的凝聚力》課件
評論
0/150
提交評論