Handler是Android消息模型最重要的一個(gè)概念,,它可以說是Android消息模型的核心,對(duì)于Looper,、MessageQueue,、Message 等概念一般在應(yīng)用中很少使用。在Android系統(tǒng)框架中也頻繁地使用Handler,,而且為了更方便地使用Handler,,還把Handler進(jìn)行了一些列的封裝,下面就通過列舉一些Handler的使用方法,。
1)Acitivity的runOnUiThread方法
使用Acitivity的runOnUiThread方法執(zhí)行代碼時(shí),,可以保證所有的代碼都在UI線程中執(zhí)行,使用方法如下:
1 | activity.runOnUiThread( new Runnable() { |
4 | textView.setText( 'HelloWorld' ); |
5 | //所有的代碼都會(huì)在UI線程中執(zhí)行 |
2)View的post和postDelay方法
View的post方法與Acitivity的runOnUiThread方法類似,,可以保證所有的代碼都在UI線程中執(zhí)行,,View的post方法使用方法如下:
1 | view.post(( new Runnable() { |
4 | textView.setText( 'HelloWorld' ); |
5 | //所有的代碼都會(huì)在UI線程中執(zhí)行 |
View的postDelay方法與post方法能保證所有的代碼都在UI線程中執(zhí)行,并且還可以讓代碼延遲一定的時(shí)間后執(zhí)行,,View的postDelay方法使用方法如下:
1 | view. postDelay (( new Runnable() { |
4 | textView.setText( 'HelloWorld' ); |
5 | //所有的代碼都會(huì)在UI線程中執(zhí)行 |
7 | }, 1000 ); // 延遲1秒執(zhí)行 |
3)AsyncTask
AsyncTask是對(duì)Android線程模型的一種高度封裝,,而且使用java的泛型技術(shù),使用非常方便,,而且能夠解決通用問題,。在使用AsyncTask類時(shí),需要擴(kuò)展它并實(shí)現(xiàn)以下幾個(gè)方法:
public void onPreExecute() 在UI線程中執(zhí)行,,進(jìn)行以下初始化操作 public Result doInBackground(Params... params) 在后臺(tái)線程中執(zhí)行 public void onProgressUpdate(Progress... values) 在UI線程中執(zhí)行,,通知UI線程更新界面 public void onPostExecute(Result result) 任務(wù)結(jié)束后,在UI線程中執(zhí)行 public void onCancelled () 任務(wù)取消時(shí),,在UI線程中執(zhí)行
AsyncTask 使用了Java的泛型技術(shù),,所以在使用時(shí)需要使用具體的類型,一般的使用方法代碼如下:
01 | public class UserTask extends AsyncTask < string,="" void,="" void=""> { |
03 | public void onPreExecute() { |
07 | public Result doInBackground(String... params) { |
08 | //在后臺(tái)線程中執(zhí)行任務(wù) |
11 | public void onCancelled() { |
12 | //取消任務(wù)時(shí)的回調(diào) |
15 | public void onPostExecute() { |
16 | //任務(wù)執(zhí)行結(jié)束時(shí)的回調(diào),,在主線程中執(zhí)行 |
在代碼中使用UserTask時(shí),必須要在UI線程中執(zhí)行execute方法,,代碼如下:
1 | new UserTask ().execute( new String [] {“”}); |
4) IdlerHandler
使用IdlerHandler可以向當(dāng)前線程的消息隊(duì)列里發(fā)送操作,,這些操作之后在空閑的時(shí)候才會(huì)執(zhí)行,它們的優(yōu)先級(jí)非常低。需要注意的是queueIdle的方法可以返回一個(gè)布爾值,,如果返回false,,說明IdleHandler執(zhí)行一次之后就會(huì)被刪除,如果返回true,,說明IdleHandler一直是有效的,,只要系統(tǒng)處于空閑狀態(tài)就執(zhí)行IdleHandler的queueIdle方法。使用方式如下:
1 | Looper.myQueue().addIdleHandler( new IdleHandler() { |
3 | public boolean queueIdle() { |
4 | //系統(tǒng)空閑時(shí)進(jìn)行資源回收操作 |
5) Handler
Handler是Android消息模型最重要的一個(gè)組件,,使用它可以在線程之間相互發(fā)送消息,,實(shí)現(xiàn)線程之間的通信。處理使用Handler發(fā)送消息以外,,通常需要繼承Handler類,,并重寫handleMessage(Message msg) 方法, 接收消息并處理消息。 下面通過一個(gè)實(shí)例來說明Handler的使用方法,。例子的主要功能是:通過線程修改界面Button的內(nèi)容,,完整的代碼如下:
01 | public class MyHandlerActivity extends Activity { |
06 | protected void onCreate(Bundle savedInstanceState) { |
07 | super .onCreate(savedInstanceState); |
08 | setContentView(R.layout.handlertest); |
09 | button = (Button) findViewById(R.id.button); |
10 | myHandler = new MyHandler(); |
11 | // 當(dāng)創(chuàng)建一個(gè)新的Handler實(shí)例時(shí), 它會(huì)綁定到當(dāng)前線程和消息的隊(duì)列中,開始分發(fā)數(shù)據(jù) |
13 | //(1) : 定時(shí)執(zhí)行Message和Runnalbe 對(duì)象 |
14 | // (2): 讓一個(gè)動(dòng)作,在不同的線程中執(zhí)行. |
17 | // postAtTime(Runnable,long) |
18 | // postDelayed(Runnable,long) |
19 | // sendEmptyMessage(int) |
20 | // sendMessage(Message); |
21 | // sendMessageAtTime(Message,long) |
22 | // sendMessageDelayed(Message,long) |
23 | // 以上方法以 post開頭的可以處理Runnable對(duì)象 |
24 | //sendMessage()可以處理Message對(duì)象(Message里可以包含數(shù)據(jù),) |
25 | MyThread m = new MyThread(); |
26 | new Thread(m).start(); |
30 | * 接受消息,處理消息 ,此Handler會(huì)與當(dāng)前主線程一塊運(yùn)行 |
32 | class MyHandler extends Handler { |
34 | //默認(rèn)構(gòu)造函數(shù) |
39 | // 帶有Looper參數(shù)的構(gòu)造函數(shù) |
40 | public MyHandler(Looper L) { |
45 | public void handleMessage(Message msg) { |
46 | Log.d( 'MyHandler' , 'handleMessage......' ); |
47 | super .handleMessage(msg); |
49 | Bundle b = msg.getData(); |
50 | String color = b.getString( 'color' ); |
51 | String btn = msg.obj.toString(); |
52 | MyHandlerActivity. this .button.append(color + btn); |
56 | class MyThread implements Runnable { |
60 | } catch (InterruptedException e) { |
61 | // TODO Auto-generated catch block |
64 | Log.d( 'thread.......' , 'mThread........' ); |
65 | // 使用Message能夠傳遞多種數(shù)據(jù)具體可以參考Message的源碼 |
66 | // 最常用的可以使用Message的obj對(duì)象在線程之間傳遞對(duì)象數(shù)據(jù) |
67 | Message msg = new Message(); |
68 | Bundle b = new Bundle(); // 存放數(shù)據(jù) |
69 | b.putString( 'color' , 'Red' ); |
71 | msg.obj = new String(“Button”); |
72 | MyHandlerActivity. this .myHandler.sendMessage(msg); // 向Handler發(fā)送消息,更新UI |
根據(jù)以上JAVA代碼編寫Demo(Handler_Test),Demo的運(yùn)行效果如下圖所示:
圖9-12 Demo運(yùn)行效果圖1 三秒鐘之后,,Button上的文字發(fā)生變化,,效果如下圖所示:
圖9-13 Demo運(yùn)行效果圖2 6) HandlerThread
HandlerThread是一個(gè)帶有消息循環(huán)的線程,并且有自己的消息隊(duì)列,,能夠接受其他線程發(fā)送消息,。使用方法Java代碼如下:
01 | HandlerThread tt = new HandlerThread( 'handlerThread' ); |
02 | tt.start(); //啟動(dòng)線程 |
03 | Handler handler = new Handler(tt.getLooper()); |
04 | handler.postDelayed( new Runnable() { |
08 | System.out.println( 'ThreadName:' + Thread.currentThread().getName()); |
09 | ((HandlerThread)Thread.currentThread()).getLooper().quit(); //關(guān)閉消息循環(huán),退出線程 |
Demo源代碼下載:游客,,如果您要查看本帖隱藏內(nèi)容請(qǐng) 回復(fù)
|