隨筆-26  評論-12  文章-0  trackbacks-0

          一、Handler的定義: 
                    主要接受子線程發送的數據, 并用此數據配合主線程更新UI. 
                    解釋: 當應用程序啟動時,Android首先會開啟一個主線程 (也就是UI線程) , 主線程為管理界面中的UI控件,進行事件分發, 比如說, 你要是點擊一個 Button, Android會分發事件到Button上,來響應你的操作。  如果此時需要一個耗時的操作,例如: 聯網讀取數據,或者讀取本地較大的一個文件的時候,你不能把這些操作放在主線程中,如果你放在主線程中的話,界面會出現假死現象, 如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示  "強制關閉".  這個時候我們需要把這些耗時的操作,放在一個子線程中,因為子線程涉及到UI更新,Android主線程是線程不安全的,也就是說,更新UI只能在主線程中更新,子線程中操作是危險的. 這個時候,Handler就出現了來解決這個復雜的問題,由于Handler運行在主線程中(UI線程中),它與子線程可以通過Message對象來傳遞數據,這個時候,Handler就承擔著接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(里面包含數據)  , 把這些消息放入主線程隊列中,配合主線程進行更新UI。

          二、Handler一些特點 
                  handler可以分發Message對象和Runnable對象到主線程中, 每個Handler實例,都會綁定到創建他的線程中(一般是位于主線程), 
                  它有兩個作用: (1):  安排消息或Runnable 在某個主線程中某個地方執行, (2)安排一個動作在不同的線程中執行 
                  Handler中分發消息的一些方法 
                  post(Runnable) 
                  postAtTime(Runnable,long) 
                  postDelayed(Runnable long) 
                  sendEmptyMessage(int) 
                  sendMessage(Message) 
                  sendMessageAtTime(Message,long) 
                  sendMessageDelayed(Message,long) 
                  以上post類方法允許你排列一個Runnable對象到主線程隊列中, 
                  sendMessage類方法, 允許你安排一個帶數據的Message對象到隊列中,等待更新. 
          三、Handler實例 
                (1) 子類需要繼承Handler類,并重寫handleMessage(Message msg) 方法, 用于接受線程數據 
                以下為一個實例,它實現的功能為 : 通過線程修改界面Button的內容

          01    public class MyHandlerActivity extends Activity {
          02         Button button;
          03         MyHandler myHandler;
          04       
          05         protected void onCreate(Bundle savedInstanceState) {
          06             super.onCreate(savedInstanceState);
          07             setContentView(R.layout.handlertest);
          08       
          09             button = (Button) findViewById(R.id.button);
          10             myHandler = new MyHandler();
          11             // 當創建一個新的Handler實例時, 它會綁定到當前線程和消息的隊列中,開始分發數據
          12             // Handler有兩個作用, (1) : 定時執行Message和Runnalbe 對象
          13             // (2): 讓一個動作,在不同的線程中執行.
          14       
          15             // 它安排消息,用以下方法
          16             // post(Runnable)
          17             // postAtTime(Runnable,long)
          18             // postDelayed(Runnable,long)
          19             // sendEmptyMessage(int)
          20             // sendMessage(Message);
          21             // sendMessageAtTime(Message,long)
          22             // sendMessageDelayed(Message,long)
          23             
          24             // 以上方法以 post開頭的允許你處理Runnable對象
          25             //sendMessage()允許你處理Message對象(Message里可以包含數據,)
          26       
          27             MyThread m = new MyThread();
          28             new Thread(m).start();
          29         }
          30       
          31         /**
          32         * 接受消息,處理消息 ,此Handler會與當前主線程一塊運行
          33         * 
          */
          34       
          35         class MyHandler extends Handler {
          36             public MyHandler() {
          37             }
          38       
          39             public MyHandler(Looper L) {
          40                 super(L);
          41             }
          42       
          43             // 子類必須重寫此方法,接受數據
          44             @Override
          45             public void handleMessage(Message msg) {
          46                 // TODO Auto-generated method stub
          47                 Log.d("MyHandler""handleMessage");
          48                 super.handleMessage(msg);
          49                 // 此處可以更新UI
          50                 Bundle b = msg.getData();
          51                 String color = b.getString("color");
          52                 MyHandlerActivity.this.button.append(color);
          53       
          54             }
          55         }
          56       
          57         class MyThread implements Runnable {
          58             public void run() {
          59       
          60                 try {
          61                     Thread.sleep(10000);
          62                 } catch (InterruptedException e) {
          63                     // TODO Auto-generated catch block
          64                     e.printStackTrace();
          65                 }
          66       
          67                 Log.d("thread.""mThread..");
          68                 Message msg = new Message();
          69                 Bundle b = new Bundle();// 存放數據
          70                 b.putString("color""我的");
          71                 msg.setData(b);
          72       
          73                 MyHandlerActivity.this.myHandler.sendMessage(msg); // 向Handler發送消息,更新UI
          74       
          75             }
          76         }

          posted on 2012-08-01 22:02 地心引力 閱讀(613) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 于都县| 灵武市| 鱼台县| 德清县| 济宁市| 富阳市| 鞍山市| 西宁市| 兰考县| 九龙县| 依兰县| 新建县| 河北省| 张家港市| 崇州市| 大荔县| 宝鸡市| 应用必备| 神农架林区| 沽源县| 香港| 辽阳市| 临西县| 崇信县| 青川县| 诸暨市| 阿坝| 滨州市| 巴彦县| 修文县| 温州市| 肃南| 隆安县| 渭源县| 正镶白旗| 略阳县| 宕昌县| 横山县| 乌拉特前旗| 合江县| 灵川县|