Android復(fù)習(xí)之旅--子線程更新UI

Android4.0版本后耗時(shí)的操作(比如請求網(wǎng)絡(luò),下載文件等)不能在UI主線程執(zhí)行传于,而且子線程也不能直接更新UI界面。而現(xiàn)實(shí)的場景確是子線程在下載文件的同時(shí)UI界面能顯示相應(yīng)的進(jìn)度信息醉顽,既然有了需求沼溜,那肯定就會(huì)有解決方案。

Android提供了Handler消息機(jī)制和AsyncTask抽象類等去實(shí)現(xiàn)子線程和UI主線程之間的通信游添。當(dāng)然還可以使用Volly系草,okhttp,Retrofit2.0等第三方開源庫來實(shí)現(xiàn)唆涝,第三方開源庫使用簡單找都,功能強(qiáng)大。

but ...廊酣,這里只對Handler和AsyncTask進(jìn)行總結(jié)能耻,至于為什么, 我是不會(huì)告訴你們是因?yàn)槲覒械腫歐耶]

好了亡驰,進(jìn)入正題 ...


Handler 消息機(jī)制

通過Handler消息機(jī)制來實(shí)現(xiàn)線程間的通信晓猛。

那么Handler是什么呢?

Handler 機(jī)制主要包括4個(gè)關(guān)鍵對象隐解,分別是Message鞍帝、Handler、MessageQueue煞茫、Looper帕涌。

  • Message 是在線程之間傳遞的消息,它可以在內(nèi)部攜帶少量的信息续徽,用于在不同的線程之間交換數(shù)據(jù)
Message msg = new Message();
msg.what = 1;  // 用于攜帶整型數(shù)據(jù)蚓曼,區(qū)別當(dāng)前消息
msg.obj = object;  //用于攜帶一個(gè)Object對象
//發(fā)送消息給Handler
handler.sendMessage(msg);
  • Handler 就是處理者的意思,它主要用于發(fā)送消息和處理消息
Handler handler = new Handler(){
      @Override
      public void handleMessage(Message msg) {
          super.handleMessage(msg);
          int what = msg.what;
          Object object = msg.obj;
      }        
};
  • MessageQueue 是消息隊(duì)列的意思钦扭,它主要用來存放通過Handler發(fā)送的消息纫版。通過Handler發(fā)送的消息會(huì)存在MessageQueue中等待處理,每個(gè)線程中有且僅有一個(gè)MessageQueue對象客情。

  • Looper 是每個(gè)線程中的MessageQueue的管家其弊,它主要進(jìn)行消息循環(huán),一旦發(fā)現(xiàn)MessageQueue中存在消息膀斋,就會(huì)把它取出并傳遞到Handler的handlerMessage()方法中(如果MessageQueue中不存在消息梭伐,Looper會(huì)自動(dòng)阻塞,相當(dāng)于wait(); 而如果Handler發(fā)送了一個(gè)消息仰担,Looper就會(huì)被喚醒)糊识,每個(gè)線程有且僅有一個(gè)Looper。

引用 Carson_Ho Handler在創(chuàng)建的時(shí)候可以顯示指定Looper,這樣在Handler在調(diào)用sendMessage()投遞消息的時(shí)候會(huì)將消息添加到指定的Looper里面的MessageQueue赂苗。如果不指定Looper愉耙,Handler默認(rèn)綁定的是創(chuàng)建它的線程的Looper。一般默認(rèn)即可拌滋。


AsyncTask 抽象類

為了可以在子線程中更好地對UI進(jìn)行操作朴沿,Android提供了一個(gè)很好用地工具類--AsyncTask。使用AsyncTask可以非常簡單地從子線程切換到主線程鸠真,它的原理是基于異步消息處理機(jī)制的悯仙。

class DownLoadTask extends AsyncTask<Void, Integer, Boolean> {
    // 1. 預(yù)加載龄毡,運(yùn)行在主線程
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }
    // 2. 正在加載吠卷,運(yùn)行在子線程(主要方法)
    @Override
    protected Boolean doInBackground(Void... params) {
        return false;
    }
    // 3. 更新進(jìn)度的方法,運(yùn)行在主線程
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }
    // 4. 加載結(jié)束沦零,運(yùn)行在主線程(主要方法)
    @Override
    protected void onPostExecute(Boolean result){
        super.onPostExecute(result);
    }
}

其中祭隔,
第一個(gè)泛型參數(shù)(對應(yīng)doInBackground里的參數(shù)類型 ):在執(zhí)行AsyncTask時(shí)需要傳入的參數(shù),用于后臺(tái)任務(wù)中使用路操;
第二個(gè)泛型參數(shù)(對應(yīng)onProgressUpdate里的參數(shù)類型):在后臺(tái)任務(wù)執(zhí)行時(shí)疾渴,如果需要在界面上顯示當(dāng)前的進(jìn)度,則使用該參數(shù)作為進(jìn)度單位屯仗;
第三個(gè)泛型參數(shù)(對應(yīng)onPostExecute里的參數(shù)類型和doInBackground的返回類型):當(dāng)任務(wù)執(zhí)行完畢后搞坝,如果需要對結(jié)果進(jìn)行返回,則使用該參數(shù)作為返回值類型魁袜。


希望對你們有所幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桩撮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峰弹,更是在濱河造成了極大的恐慌店量,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞠呈,死亡現(xiàn)場離奇詭異融师,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚁吝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門旱爆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窘茁,你說我怎么就攤上這事怀伦。” “怎么了庙曙?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵空镜,是天一觀的道長。 經(jīng)常有香客問我,道長吴攒,這世上最難降的妖魔是什么张抄? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮洼怔,結(jié)果婚禮上署惯,老公的妹妹穿的比我還像新娘。我一直安慰自己镣隶,他們只是感情好极谊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著安岂,像睡著了一般轻猖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上域那,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天墓律,我揣著相機(jī)與錄音檩咱,去河邊找鬼灵汪。 笑死垒酬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的淑蔚。 我是一名探鬼主播市殷,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刹衫!你這毒婦竟也來了醋寝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤绪妹,失蹤者是張志新(化名)和其女友劉穎甥桂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邮旷,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄选,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婶肩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片办陷。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖律歼,靈堂內(nèi)的尸體忽然破棺而出民镜,到底是詐尸還是另有隱情,我是刑警寧澤险毁,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布制圈,位于F島的核電站们童,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鲸鹦。R本人自食惡果不足惜慧库,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馋嗜。 院中可真熱鬧齐板,春花似錦、人聲如沸葛菇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽眯停。三九已至济舆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庵朝,已是汗流浹背吗冤。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工又厉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留九府,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓覆致,卻偏偏與公主長得像侄旬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子煌妈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容