成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android中Message機制的靈活應用

移動開發(fā) Android
對于Android的Message機制主要涉及到三個主要的類,分別是Handler、Message、Looper;本文首先對每個類做一個簡單介紹;然后再介紹所謂的Android的Message機制是如何實現(xiàn)的。

正式開始介紹Android開發(fā)中Message機制應用,希望你有所收獲。

一、線程間通訊的Message機制

1、Message介紹

frameworks\base\core\java\android\Os\Message.java

Message是線程之間傳遞信息的載體,包含了對消息的描述和任意的數(shù)據(jù)對象。Message中包含了兩個額外的 int字段和一個object字段,這樣在大部分情況下,使用者就不需要再做內(nèi)存分配工作了。雖然Message的構造函數(shù)是public的,但是***是 使用Message.obtain( )或Handler.obtainMessage( )函數(shù)來獲取Message對象,因為Message的實現(xiàn)中包含了回收再利用的機制,可以提供效率。

2、MessageQueue介紹

frameworks\base\core\java\android\Os\MessageQueue.java

MessageQueue用來容納Message隊列的,其中的Message是由Looper來分發(fā)的,Message不能直接添加到MessageQueue中,而是要通過與Looper關聯(lián)的Handler去添加。

3、Looper

frameworks\base\core\java\android\Os\Looper.java

Looper是線程用來運行消息循環(huán)的。線程本身是沒有消息循環(huán)的,需要在線程中調(diào)用perpare函數(shù),然后調(diào)用loop去處理消息。在Android中,系統(tǒng)在啟動主線程的時候會自動為之建立一個Looper。

建立本線程的Looper:

public static final void prepare()

運行本線程的Looper:

public static final void loop()

獲取本線程的Looper:

public static final Looper myLooper()

獲取主線程的Looper:

public synchronized static final Looper getMainLooper()

4、Handler

frameworks\base\core\java\android\Os\Handler.java

Handler是用來發(fā)送和處理與線程相關聯(lián)的Message和Runnable對象的。每個Handler都與一個單獨的線程以及線程消息隊列相 關聯(lián)的。當你創(chuàng)建Handler時,Handler就與線程以及線程消息隊列綁定了,從那以后,Handler就可以將 Message和Runnable發(fā)送給對應的消息隊列,并且能夠處理從消息隊列中出來的消息。

Handler提供了用戶需要調(diào)用的大部分接口

A、創(chuàng)建Handler:

創(chuàng)建與本地線程相關聯(lián)的Handler:

public     Handler()

public     Handler(Callback callback)

創(chuàng)建與指定線程相關聯(lián)的Handler:

public     Handler(Looper looper)

public     Handler(Looper looper, Callback callback)

B、創(chuàng)建消息

  1. public final Message obtainMessage() 
  2. public final Message obtainMessage(int what) 
  3. public final Message obtainMessage(int what, Object obj) 
  4. public final Message obtainMessage(int what, int arg1, int arg2) 
  5. public final Message obtainMessage(int what, int arg1, int arg2, Object obj) 

C、刪除消息

刪除在消息隊列中未處理的消息

  1. public final void removeMessages(int what) 
  2. public final void removeMessages(int what, Object object) 

D、發(fā)送消息

  1. public final boolean sendMessage(Message msg) 
  2. public final boolean sendMessageDelayed(Message msg, long delayMillis) 
  3. public final boolean post(Runnable r) 
  4. public final boolean postDelayed(Runnable r, long delayMillis) 

E、處理消息

在Looper的loop函數(shù)中循環(huán)取出MessageQueue的接收消息隊列中的消息,然后調(diào)用Hander的dispatchMessage函數(shù)對消息進行處理,至于如何處理(相應消息)則由用戶指 定(三個方法,優(yōu)先級從高到低:Message里面的Callback,一個實現(xiàn)了Runnable接口的對象,其中run函數(shù)做處理工 作;Handler里面的mCallback指向的一個實現(xiàn)了Callback接口的對象,里面的handleMessage進行處理;處理消息 Handler對象對應的類繼承并實現(xiàn)了其中handleMessage函數(shù),通過這個實現(xiàn)的handleMessage函數(shù)處理消息)。

  1. public void dispatchMessage(Message msg) { 
  2. if (msg.callback != null) { 
  3.        handleCallback(msg); 
  4.       } else { 
  5.       if (mCallback != null) { 
  6.       if (mCallback.handleMessage(msg)) { 
  7.            return
  8.       } 
  9.       } 
  10.       handleMessage(msg); 

二、Message機制的用途

Message機制有兩種用途:

定時執(zhí)行:延遲到指定時間執(zhí)行消息調(diào)度

線程通訊:將某些操作在其他線程中排隊執(zhí)行

1、定時執(zhí)行

通過本線程的Handler將消息延遲到指定時間執(zhí)行,相當于定時器的作用

  1. public final boolean sendMessageDelayed(Message msg, long delayMillis) 
  2. public final boolean postDelayed(Runnable r, long delayMillis) 

還可以在指定時間到期之前,通過removeMessages取消執(zhí)行

2、線程通訊

Android的UI是單線程的,Android希望UI線程能夠給予User快速的反應,如果UI線程花費太多的時間做幕后的事情,吵過5秒 鐘,Android就會給出錯誤提示。因此為了避免拖住UI,一下較費時的工作應該交給獨立的線程去執(zhí)行。但是如果幕后的線程來執(zhí)行UI對 象,Android又會發(fā)出錯誤信息,所以UI線程與幕后線程需要進行通訊。UI線程將工作分發(fā)給幕后線程,幕后線程執(zhí)行后將相應的狀態(tài)返回給UI線程, 讓UI線程對UI做成相應的更新。

總結:所謂的消息機制其實很簡單,實現(xiàn)這種機制需要只需要四步:

     1、實例化Looper(因為實例化Handler時需要一個looper);

     2、實例化Handler,這里需要覆蓋handleMessage方法,處理收到的消息;

     3、 實例化Message對象,調(diào)用已經(jīng)實例化好的handler對象的obtainMessage方法,把數(shù)據(jù)傳給obtainMessage方 法,obtainMessage方法就會實例化一個Message對象。(這里也可以發(fā)送實現(xiàn)Runnable接口的對象);

     4、調(diào)用Handler的sendMessage方法把實例化好的Message對象發(fā)送出去。對每個線程過程都是一樣的,只要按照上面的四個步驟來就可以發(fā)送和接收消息了。

通過全文的閱讀相信你已經(jīng)對Message機制應用有了一定的理解,希望今后多多實踐練習,一定會熟練掌握。

責任編輯:閆佳明 來源: oschina
相關推薦

2009-03-20 13:40:15

JDK線程并發(fā)

2012-01-10 10:05:47

文件目錄訪問控制UGO

2013-03-28 09:07:37

Android開發(fā)Intent機制

2017-05-15 19:40:40

AndroidIPC機制

2009-09-18 13:07:53

2023-06-27 08:37:35

Java反射動態(tài)代理機制

2021-11-24 08:33:09

Android廣播機制應用程序

2010-02-24 15:20:23

WCF Message

2010-07-05 11:45:27

RationalJazz需求管理

2021-08-01 23:47:54

通用模型驅動

2013-04-11 12:40:16

Android消息機制

2010-01-26 14:38:08

Android數(shù)字證書

2009-06-17 16:58:42

2011-12-12 09:04:35

HTML 5

2016-01-11 10:25:56

2024-06-28 08:04:43

語言模型應用

2023-12-20 12:40:51

C++RAII編程

2023-09-22 09:04:00

C++編程

2012-08-16 09:41:51

云網(wǎng)絡應用性能云計算

2012-08-15 09:31:23

虛擬數(shù)據(jù)中心VPNOpenflow
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天操天天操 | 成人av免费网站 | 欧美美女二区 | 免费一级毛片 | 久久久久国产精品午夜一区 | 中文字幕一级 | 国产精品伦一区二区三级视频 | 欧美视频二区 | 九九九久久国产免费 | 日韩福利片 | 久久久久久久av麻豆果冻 | 天天干精品 | 久草在线 | 精品一区二区三区在线观看国产 | 在线黄色网 | 麻豆av在线 | 免费成人av | 伊人热久久 | 国产人成精品一区二区三 | 日韩国产一区 | 国产高清在线精品一区二区三区 | 99爱在线视频 | 亚洲一本 | 日本一区视频在线观看 | 浮生影院免费观看中文版 | 怡红院怡春院一级毛片 | 欧美理论 | 亚洲色图综合网 | 国产精品视频播放 | xx视频在线 | 久草在线在线精品观看 | 中文字幕人成乱码在线观看 | 天天操 夜夜操 | 久久久爽爽爽美女图片 | 亚洲美女视频 | 日韩aⅴ在线观看 | 天天干天天干 | 免费国产一区二区 | 在线视频三区 | 在线观看国产视频 | 精品毛片|