? ? ? ?我們進行Android開發時,Handler可以說是使用非常頻繁的一個概念,它的用處不言而喻。本文就詳細介紹Handler的基本概念和用法。
???????Handler的基本概念?
?
?????? Handler主要用于異步消息的處理:當發出一個消息之后,首先進入一個消息隊列,發送消息的函數即刻返回,而另外一個部分逐個的在消息隊列中將消息取出,然后對消息進行出來,就是發送消息和接收消息不是同步的處理。 這種機制通常用來處理相對耗時比較長的操作。
?????? Handler工具類在多線程中有兩方面的應用:
1、發送消息,在不同的線程間發送消息,使用的方法為sendXXX();。
android.os.Handler對象通過下面的方法發送消息的:
sendEmptyMessage(int),發送一個空的消息;
sendMessage(Message),發送消息,消息中可以攜帶參數;
sendMessageAtTime(Message, long),未來某一時間點發送消息;
sendMessageDelayed(Message, long),延時Nms發送消息。
???????2、計劃任務,在未來執行某任務,使用的方法為postXXX();。
android.os.Handler對象通過下面的方法執行計劃任務:
post(Runnable),提交計劃任務馬上執行;
postAtTime(Runnable, long),提交計劃任務在未來的時間點執行;
postDelayed(Runnable, long),提交計劃任務延時Nms執行。
?????? 使用一個例子簡單的來介紹一下Handler。
???????示例1:一個應用程序中有2個按鈕(start、end),當點擊start按鈕時,執行一個線程,這個線程在控制臺輸出一串字符串,并且每隔3秒再執行一次線程,直到點擊end按鈕為止,線程停止。
?????? 下圖為這個應用程序的界面:
?????? 下圖為執行程序時控制臺的輸出:
??????開發步驟:?
????? 1、新建一個Android應用程序?
????? 2、在布局文件中添加2個Button控件標簽,并為其設置屬性和值?
????? 3、在Activity中,聲明控件變量并根據id獲得控件對象?
????? 4、在Activity中,創建一個Handler對象?
????? 5、在Activity中,創建一個Runnable對象?
????? a) 以匿名內部類的方式?
??????b) 將要執行的操作寫在Runnable對象中的run()方法中?
????? i. 打印出一句話?
????? ii. 調用Runnable對象的postDelayed()方法?
????? 6、在Activity中,編寫start按鈕需要的監聽器,并綁定。
????? 在這個監聽器的Onclick()方法中,調用Handler的post()方法,將要執行的線程對象放到隊列當中。?
????? 7、在Activity中,編寫end按鈕需要的監聽器,并幫定。
????? 在這個監聽器的Onclick()方法中,調用Handler的removeCallbacks ()方法,刪除隊列當中未執行的線程對象。?
????? 下面是Activity的代碼:
Java代碼
package?android.handler;??? ???? ??import?android.app.Activity;??? ??import?android.os.Bundle;??? ??import?android.os.Handler;??? ??import?android.view.View;??? ??import?android.view.View.OnClickListener;??? ??import?android.widget.Button;??? ???? ??public?class?HandlerTest?extends?Activity?{??? ??????????private?Button?startButton;??? ??????private?Button?endButton;??? ????????? ??????@Override?? ??????public?void?onCreate(Bundle?savedInstanceState)?{??? ??????????super.onCreate(savedInstanceState);??? ??????????setContentView(R.layout.main);??? ??????????????????startButton?=?(Button)findViewById(R.id.startButton);??? ??????????endButton?=?(Button)findViewById(R.id.endButton);??? ??????????????????startButton.setOnClickListener(new?StartButtonListener());??? ??????????endButton.setOnClickListener(new?EndButtonListener());??? ??????}??? ????????? ??????class?StartButtonListener?implements?OnClickListener{??? ??????????public?void?onClick(View?v)?{??? ??????????????????????????handler.post(updateThread);??? ??????????}??? ??????}??? ????????? ??????class?EndButtonListener?implements?OnClickListener{??? ??????????public?void?onClick(View?v)?{??? ??????????????????????????handler.removeCallbacks(updateThread);??? ??????????}??? ????????????? ??????}??? ????????? ??????????Handler?handler?=?new?Handler();??? ??????????Runnable?updateThread?=?new?Runnable(){??? ??????????????????public?void?run(){??? ??????????????System.out.println("updateThread");??? ??????????????????????????????????????????????????????????????handler.postDelayed(updateThread,?3000);??? ??????????}??? ??????};??? ??}???? ???????示例2:一個應用程序中有一個進度條和一個按鈕,當點擊按鈕后,每隔一秒鐘進度條前進一部分。
???????開發步驟:
?????? 1、新建一個Android應用程序
?????? 2、在布局文件中添加一個progressBar和一個Button,并為其設置屬性和值
?????? 3、在Activity中,聲明控件變量并根據id獲得控件對象
?????? 4、創建線程對象
???????a)通過匿名內部類的方式
?????? b)在編寫完了5、6步之后再來繼續編寫這個線程對象里的操作
?????? i. 聲明一個變量用來設置進度條的進度
?????? ii. 重寫線程類的run方法(),里面編寫要執行的操作
?????? 1)打印一個字符串
?????? 2)進度條的值增加
?????? 3)得到一個消息對象
?????? 4)設置消息對象arg1的值
?????? 5)讓線程休眠一秒鐘
?????? 6)將消息對象放入到消息隊列中
?????? 7)判斷,如果進度條的值等于100,則將線程對象從隊列中移除。
?????? 5、 創建Handler對象
?????? a) 與示例1不同的地方是,這里是通過匿名內部類的方式來聲明的,而示例1是直接new出來的對象。
?????? b) 重寫Handler對象的handlerMessage(Message msg)方法。
?????? i. 這個方法傳入了一個Message對象,即消息對象,首先設置進度條的進度(這個值是Messag對象里面的一個成員變量arg1)。
???????ii. 將要執行的線程對象放入到隊列當中。
?????? 6、 編寫Button需要的監聽器,并綁定
?????? a) 設置進度條為顯示狀態。
?????? b) 將要執行的線程對象放入到隊列當中。
?????? 下面是Activity的代碼:
Java代碼
package?android.handler;??? ???? ??import?android.app.Activity;??? ??import?android.os.Bundle;??? ??import?android.os.Handler;??? ??import?android.os.Message;??? ??import?android.view.View;??? ??import?android.view.View.OnClickListener;??? ??import?android.widget.Button;??? ??import?android.widget.ProgressBar;??? ???? ??public?class?ProgressBarHandlerTest?extends?Activity?{??? ????????????? ??????private?ProgressBar?progressBar;??? ??????private?Button?startButton;??? ????????? ??????@Override?? ??????public?void?onCreate(Bundle?savedInstanceState)?{??? ??????????super.onCreate(savedInstanceState);??? ??????????setContentView(R.layout.main);??? ????????????? ??????????progressBar?=?(ProgressBar)findViewById(R.id.progressbar);??? ??????????startButton?=?(Button)findViewById(R.id.startButton);??? ????????????? ??????????startButton.setOnClickListener(new?ProgressBarOnClickListener());??? ??????}??? ????????? ??????class?ProgressBarOnClickListener?implements?OnClickListener{??? ??????????public?void?onClick(View?v)?{??? ??????????????????????????progressBar.setVisibility(View.VISIBLE);??? ??????????????updateBarHandler.post(updateThread);??? ??????????}??? ??????}??? ????????? ??????????Handler?updateBarHandler?=?new?Handler(){??? ??????????@Override?? ??????????public?void?handleMessage(Message?msg)?{??? ??????????????progressBar.setProgress(msg.arg1);??? ??????????????updateBarHandler.post(updateThread);????????????}??? ??????};??? ????????? ??????????Runnable?updateThread?=?new?Runnable(){??? ??????????int?i?=?0;??? ??????????public?void?run()?{??? ??????????????????????????System.out.println("Begin?Thread");??? ??????????????i+=10;??? ??????????????????????????Message?msg?=?updateBarHandler.obtainMessage();??? ??????????????????????????msg.arg1?=?i;???????????????try{??? ??????????????????Thread.sleep(1000);?????????????}catch(InterruptedException?ex){??? ??????????????????ex.printStackTrace();??? ??????????????}??? ??????????????????????????updateBarHandler.sendMessage(msg);??? ??????????????????????????if?(i?==?100){??? ??????????????????????????????????updateBarHandler.removeCallbacks(updateThread);???? ??????????????}??? ??????????}??? ??????};??? ??}???? ?
總結
以上是生活随笔為你收集整理的详解Android Handler的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。