• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Android環(huán)境下主UI線程與子線程通信機(jī)制研究

      2016-11-09 22:45:56孫翠改
      關(guān)鍵詞:通信線程

      孫翠改

      摘要:Android的應(yīng)用程序支持多線程,某些android程序在處理事件代碼時,可以將耗時的操作交給另外一個子線程來執(zhí)行,從而保證主UI線程的暢通,避免出現(xiàn)響應(yīng)較慢導(dǎo)致用戶長時間的等待,因此對于不需要同步阻塞去等待返回結(jié)果的應(yīng)用,可以通過多線程來實(shí)現(xiàn)異步。多線程編程為我們充分利用系統(tǒng)資源提供了便利,同時也為設(shè)計(jì)復(fù)雜UI和耗時操作提供了途徑,提升了安卓用戶的使用體驗(yàn)。本文來研究和使用多線程編程,對我們學(xué)習(xí)安卓編程有著十分重要的作用。

      關(guān)鍵詞:Android UI 線程 通信

      中圖分類號:TP316.4 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2016)09-0066-02

      Abstract:Android applications support multithreading, some Android application in the treatment of the event code, can be time-consuming operation to another child thread to perform, so as to ensure the smooth of the main UI thread, avoid response slow lead to the user for a long time waiting, so does not need to be synchronized block to wait to return the result of application, can be done by multi-thread asynchronous. Multithreaded programming provides a convenient for us to make full use of system resources, but also provides a way to design complex UI and time-consuming operation, improving the use of the android user experience. In this paper, to study and use of multithreaded programming, learning android programming is very important to us.

      Key Words:Android; UI; thread; communication

      1 問題的引出

      如果需要用手機(jī)從網(wǎng)絡(luò)上下載一個圖片到自己的手機(jī)上,在onCreate方法中可以如下圖1所示的代碼。通過代碼會獲取并顯示所需要的位圖。但其中隱藏著一個非常危險的問題——代碼本身就是運(yùn)行在主線程上。Android系統(tǒng)只能運(yùn)行一個主線程,而且只有主線程能夠與屏幕之間進(jìn)行任意權(quán)限級別的交互。這意味著,當(dāng)代碼等待網(wǎng)絡(luò)回傳圖片數(shù)據(jù)的時候,任何內(nèi)容都無法顯示到屏幕上。這段獲取圖片的代碼會限制在手機(jī)上任意地方執(zhí)行任意操作。所以如果主線程被綁架,那么它在被釋放之前,系統(tǒng)就不會響應(yīng)按單擊事件,不能接電話,屏幕上不能顯示任何內(nèi)容。這對于手機(jī)用戶來說是災(zāi)難性的。

      2 什么是子線程

      為了有效解決手機(jī)被綁架的問題,提高用戶體驗(yàn),提出了子線程。在Android的布局界面中,可以實(shí)現(xiàn)按鈕的單擊、TextView內(nèi)容的修改,所有這些與界面控件相關(guān)的操作,實(shí)際上都是由主UI線程在負(fù)責(zé)運(yùn)行。但有時候,程序會執(zhí)行一些耗時的操作,比如復(fù)雜的計(jì)算、訪問網(wǎng)絡(luò),下載數(shù)據(jù),查詢數(shù)據(jù)庫、甚至包括讓線程休眠等,這些操作如果放到主UI線程中執(zhí)行,會造成主UI線程無法及時響應(yīng)用戶在界面上的操作,造成界面假死的狀態(tài)。一般的解決方案是將耗時的操作交給另外一個子線程來執(zhí)行,從而保證主UI線程的暢通。有時候子線程在完成了一部分的耗時操作以后,希望能夠在主界面上有所體現(xiàn),此時子線程是不能夠直接操作界面控件的,它必須通過消息的方式告知主UI線程進(jìn)行控件更新。

      3 子線程與主UI線程的通信原理

      Android應(yīng)用程序運(yùn)行時,一個主線程被創(chuàng)建(也稱作UI線程),此線程主要負(fù)責(zé)處理UI相關(guān)的事件,由于Android采用UI單線程模型,所以只能在主線程中對UI元素進(jìn)行操作,如果在非UI線程直接對UI進(jìn)行了操作,則會報(bào)錯,另外,對于運(yùn)算量較大的操作和IO操作,我們需要新開線程來處理這些工作,以免阻塞UI線程,子線程與主線程之間通信原理如下圖2所示。

      從上圖2可以看出,要完成子線程與主UI線程之間的通信,需要配合多個類來完成。其中Thread類負(fù)責(zé)線程工作,要創(chuàng)建該類需要實(shí)現(xiàn)Runnable接口的run( )方法,run( )方法中一般是耗時操作的代碼。第二個類是Message類,用來描述消息,在Message對象中可以存儲一些信息。第三個類是Handler類,用來發(fā)送和接受消息,要創(chuàng)建該類需要實(shí)現(xiàn)handleMessage(Message msg)方法,該方法會在Handler對象接收到消息時被調(diào)用。那么這三個類之間協(xié)同合作,才能有序地完成子線程與主UI線程之間的通信。

      3.1 Thread類

      要創(chuàng)建子線程對象,就需要使用Thread類。要創(chuàng)建該類需要實(shí)現(xiàn)Runnable接口的抽象方法run( ),在run( )方法中需要添加子線程所要運(yùn)行任務(wù)的代碼。其次,Sleep(long time)方法是讓線程休眠,其中time為休眠的時間,單位時毫秒。最后一定要用start( )方法運(yùn)行線程。之后該子線程就可以開始工作了。

      子線程在特定情況下需要通過Handler發(fā)送Message給主UI線程,委托主UI線程進(jìn)行一些與界面相關(guān)的處理,所以,發(fā)送消息的Handler類也是其中的一個很重要的類。

      3.2 Message類

      Message類型的消息中包含了一個int類型的成員對象what,利用what可以區(qū)分不同的消息類型。返回值有兩種情況,如果消息成功放置到消息隊(duì)列則返回true,否則返回false。

      3.3 Handler類

      發(fā)送消息:所使用的類為Handler類,方法為public boolean sendMessage(Message msg),其中,msg是消息對象。Message類型的消息中包含了一個int類型的成員對象what,利用what可以區(qū)分不同的消息類型。子線程將消息發(fā)送給主線程,主線程收到消息之后,會根據(jù)傳過來的消息信號的不同做不同的動作。如果消息號為STOP,則子線程結(jié)束消息的傳送,如果消息號為CONTINUE,則繼續(xù)傳送消息。當(dāng)子線程的狀態(tài)發(fā)生變化,則在子線程中發(fā)出Message,通知更新UI。

      接收處理消息:使用的是Handler類,方法為public void han

      dleMessage(Message msg),通過判斷msg.what可以區(qū)分不同的消息類型。根據(jù)不同的消息類型,主UI線程會產(chǎn)生不同的動作來響應(yīng)子線程。

      4 子線程與主線程之間通信的實(shí)例

      該程序的界面如圖3所示,界面中存在一個水平進(jìn)度條和一個大環(huán)形進(jìn)度條,以及一個TextView來顯示“界面加載中。。?!?。運(yùn)行中:水平滾動條每1秒前進(jìn)一格,當(dāng)進(jìn)度條的進(jìn)度達(dá)到100%時,TextView顯示“頁面加載完畢”。

      分析:要完成這樣的任務(wù),需要讓程序循環(huán)性地休眠1s后,更新水平進(jìn)度條。但是如果讓主程序休眠,會導(dǎo)致界面假死狀態(tài),造成用戶使用感受的下降,如何解決?就用到了上面所提到的線程。實(shí)現(xiàn)過程代碼如下圖4所示。

      5 需要改善的幾個問題

      (1)設(shè)置線程的中斷標(biāo)記,有效地控制線程的進(jìn)度。在Eclipse中創(chuàng)建Android項(xiàng)目,通過實(shí)現(xiàn)Runnable接口來創(chuàng)建線程、開啟線程、讓線程休眠指定的時間,除此之外,還可以中斷線程。當(dāng)需要中斷指定線程時,可以使用Thread類提供的interrupt()方法來實(shí)現(xiàn)。使用interrupt()方法可以向指定的線程發(fā)送一個中斷請求,此時可以使用一個boolean型的標(biāo)記變量來記錄該線程的中斷狀態(tài),并通過該標(biāo)記變量來控制循環(huán)的執(zhí)行與停止。

      (2)子線程開啟消息循環(huán)。在Andorid中一個線程對應(yīng)一個Looper對象,而一個Looper對象對應(yīng)一個MessageQueue消息隊(duì)列,消息隊(duì)列里面用于存放消息。Looper對象用來為一個線程開啟一個消息循環(huán),用來操作消息隊(duì)列。默認(rèn)情況下,系統(tǒng)自動為主線程開啟消息循環(huán),新建子線程中則需要手動開啟,否則會拋出異常。

      6 結(jié)語

      Android的應(yīng)用程序的多線程編程為我們充分利用系統(tǒng)資源提供了便利,同時也為設(shè)計(jì)復(fù)雜UI和耗時操作提供了途徑,提升了手機(jī)用戶的使用體驗(yàn)。在子線程與UI主線程通信過程中,用到了try{ }catch{Exception e}{ }語句,這個語法是代碼異常處理的,如果沒有try的話,出現(xiàn)異常會導(dǎo)致程序崩潰。而try則可以保證程序的正常運(yùn)行下去,并且輸出為什么出錯,對程序的維護(hù)有很大的幫助。

      另外在主線程上應(yīng)該避免下列操作:與網(wǎng)絡(luò)相關(guān)的操作;需要對文件系統(tǒng)進(jìn)行讀寫操作的任務(wù);任何種類的繁重事務(wù)處理(如圖片或視頻修改);在等待某個事務(wù)完成時會阻礙線程執(zhí)行的任務(wù)等等。因此,作為一般規(guī)律,如果不涉及對用戶界面的設(shè)置或修改,就不要放在主線程上。

      參考文獻(xiàn)

      [1]余永佳,趙佩華,等.Android應(yīng)用開發(fā)基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2014.

      [2]蓋索林.Android開發(fā)入門指南(第二版)[M].北京:人民郵電出版社,2013.

      猜你喜歡
      通信線程
      淺談linux多線程協(xié)作
      基于“一級調(diào)度、兩級運(yùn)維”的通信管理體系研究①
      科技資訊(2016年19期)2016-11-15 10:10:38
      簡述計(jì)算機(jī)通信網(wǎng)絡(luò)安全與防護(hù)策略
      無線自組網(wǎng)在野戰(zhàn)防空通信系統(tǒng)中的應(yīng)用
      對數(shù)字微波通信技術(shù)的研究
      Linux線程實(shí)現(xiàn)技術(shù)研究
      么移動中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
      JAVA多線程同步解決生產(chǎn)者—消費(fèi)者問題
      岳普湖县| 平乐县| 周至县| 泽州县| 沈阳市| 竹山县| 砚山县| 察隅县| 乌拉特前旗| 迁西县| 福州市| 象山县| 霍山县| 额尔古纳市| 昌乐县| 赤水市| 平江县| 米林县| 烟台市| 冕宁县| 泉州市| 宜丰县| 泰来县| 昌黎县| 当雄县| 英山县| 古丈县| 鄂伦春自治旗| 五常市| 莱州市| 房山区| 重庆市| 扬中市| 乌兰县| 宁武县| 嘉义市| 玉环县| 镇康县| 旬阳县| 凉城县| 株洲县|