Android——Handler总结
一、Handler的定義:
????????? 主要接受子線程發(fā)送的數(shù)據(jù), 并用此數(shù)據(jù)配合主線程更新UI.
????????? 解釋: 當應(yīng)用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控件,進行事件分發(fā), 比如說, 你要是點擊一個 Button, Android會分發(fā)事件到Button上,來響應(yīng)你的操作。? 如果此時需要一個耗時的操作,例如: 聯(lián)網(wǎng)讀取數(shù)據(jù),或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現(xiàn)假死現(xiàn)象, 如果5秒鐘還沒有完成的話,會收到Android系統(tǒng)的一個錯誤提示? "強制關(guān)閉".? 這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的. 這個時候,Handler就出現(xiàn)了來解決這個復(fù)雜的問題,由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數(shù)據(jù),這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數(shù)據(jù))? , 把這些消息放入主線程隊列中,配合主線程進行更新UI。
二、Handler一些特點
??????? handler可以分發(fā)Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創(chuàng)建他的線程中(一般是位于主線程),
??????? 它有兩個作用: (1):? 安排消息或Runnable 在某個主線程中某個地方執(zhí)行, (2)安排一個動作在不同的線程中執(zhí)行
??????? Handler中分發(fā)消息的一些方法
??????? post(Runnable)
??????? postAtTime(Runnable,long)
??????? postDelayed(Runnable long)
??????? sendEmptyMessage(int)
??????? sendMessage(Message)
??????? sendMessageAtTime(Message,long)
??????? sendMessageDelayed(Message,long)
??????? 以上post類方法允許你排列一個Runnable對象到主線程隊列中,
??????? sendMessage類方法, 允許你安排一個帶數(shù)據(jù)的Message對象到隊列中,等待更新.
三、Handler實例
????? (1) 子類需要繼承Handler類,并重寫handleMessage(Message msg) 方法, 用于接受線程數(shù)據(jù)
????? 以下為一個實例,它實現(xiàn)的功能為 : 通過線程修改界面Button的內(nèi)容?? ?
public class MyHandlerActivity extends Activity {
???? Button button;
???? MyHandler myHandler;
?
???? protected void onCreate(Bundle savedInstanceState) {
???????? super.onCreate(savedInstanceState);
???????? setContentView(R.layout.handlertest);
?
???????? button = (Button) findViewById(R.id.button);
???????? myHandler = new MyHandler();
???????? // 當創(chuàng)建一個新的Handler實例時, 它會綁定到當前線程和消息的隊列中,開始分發(fā)數(shù)據(jù)
???????? // Handler有兩個作用, (1) : 定時執(zhí)行Message和Runnalbe 對象
???????? // (2): 讓一個動作,在不同的線程中執(zhí)行.
?
???????? // 它安排消息,用以下方法
???????? // post(Runnable)
???????? // postAtTime(Runnable,long)
???????? // postDelayed(Runnable,long)
???????? // sendEmptyMessage(int)
???????? // sendMessage(Message);
???????? // sendMessageAtTime(Message,long)
???????? // sendMessageDelayed(Message,long)
?????? ?
???????? // 以上方法以 post開頭的允許你處理Runnable對象
???????? //sendMessage()允許你處理Message對象(Message里可以包含數(shù)據(jù),)
?
???????? MyThread m = new MyThread();
???????? new Thread(m).start();
???? }
?
???? /**
???? * 接受消息,處理消息 ,此Handler會與當前主線程一塊運行
???? * */
?
???? class MyHandler extends Handler {
???????? public MyHandler() {
???????? }
?
???????? public MyHandler(Looper L) {
???????????? super(L);
???????? }
?
???????? // 子類必須重寫此方法,接受數(shù)據(jù)
???????? @Override
???????? public void handleMessage(Message msg) {
???????????? // TODO Auto-generated method stub
???????????? Log.d("MyHandler", "handleMessage......");
???????????? super.handleMessage(msg);
???????????? // 此處可以更新UI
???????????? Bundle b = msg.getData();
???????????? String color = b.getString("color");
???????????? MyHandlerActivity.this.button.append(color);
?
???????? }
???? }
?
???? class MyThread implements Runnable {
???????? public void run() {
?
???????????? try {
???????????????? Thread.sleep(10000);
???????????? } catch (InterruptedException e) {
???????????????? // TODO Auto-generated catch block
???????????????? e.printStackTrace();
???????????? }
?
???????????? Log.d("thread.......", "mThread........");
???????????? Message msg = new Message();
???????????? Bundle b = new Bundle();// 存放數(shù)據(jù)
???????????? b.putString("color", "我的");
???????????? msg.setData(b);
?
???????????? MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler發(fā)送消息,更新UI
?
???????? }
???? }
?
引自:http://www.open-open.com/lib/view/open1335967054421.html
轉(zhuǎn)載于:https://www.cnblogs.com/Defry/p/4384626.html
總結(jié)
以上是生活随笔為你收集整理的Android——Handler总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: how to use the mathm
- 下一篇: keil c51的内部RAM(idata