handler

 

1、Handler的定義:數據庫

  主要接受子線程發送的數據, 並用此數據配合主線程更新UI。安全

  解釋:當應用程序啓動時,Android首先會開啓一個主線程 (也就是UI線程) , 主線程爲管理界面中的UI控件, 進行事件分發, 好比說, 你要是點擊一個 Button ,Android會分發事件到Button上,來響應你的操做。  若是此時須要一個耗時的操做,例如: 聯網讀取數據,    或者讀取本地較大的一個文件的時候,你不能把這些操做放在主線程中,若是你放在主線程中的話,界面會出現假死現象, 若是5秒鐘尚未完成的話,會收到Android系統的一個錯誤提示  "強制關閉"。  這個時候咱們須要把這些耗時的操做,放在一個子線程中,由於子線程涉及到UI更新,,Android主線程是線程不安全的, 也就是說,更新UI只能在主線程中更新,子線程中操做是危險的。 這個時候,Handler就出現了。,來解決這個複雜的問題 ,因爲Handler運行在主線程中(UI線程中),  它與子線程能夠經過Message對象來傳遞數據, 這個時候,Handler就承擔着接受子線程傳過來的(子線程用sedMessage()方法傳弟)Message對象,(裏面包含數據)  , 把這些消息放入主線程隊列中,配合主線程進行更新UI。ide

簡單案例:點擊按鈕發起倆個線程this

首先定義兩個子線程spa

1     private Runnable doinbackground;//子線程1
2     private Runnable doinbackground2;//子線程2
3     private Handler handler; 

new出子線程1線程

 1         doinbackground = new Runnable() {
 2 
 3             @Override
 4             public void run() {
 5                 // TODO Auto-generated method stub
 6                 Log.i("sub_Thread", "子線程1啓動,id"
 7                         + Thread.currentThread().getId());
8         //1.訪問數據庫或者互聯網,不在UI進程,因此不卡14 Message msg = new Message();
           //對消息一個識別號,便於handler可以識別
15 msg.what = 1; 16 handler.sendMessage(msg); 17 Log.i("sub_Thread", "子線程1已經發送消息給handler"); 18 } 19 };

同理new 子線程2日誌

 1         doinbackground2 = new Runnable() {
 2 
 3             @Override
 4             public void run() {
 5                 // TODO Auto-generated method stub
 6                 Log.i("sub_Thread", "子線程2啓動,id"
 7                         + Thread.currentThread().getId());14                 Message msg = new Message();
15                 msg.what = 2;
16                 handler.sendMessage(msg);20                 Log.i("sub_Thread", "子線程2已經發送消息給handler");
21             }
22         };

handler的代碼code

 1 handler = new Handler() {
 2 
 3             @Override
 4             public void handleMessage(Message msg) {
 5                 // TODO Auto-generated method stub
 6                 super.handleMessage(msg);
 7                 int id = msg.what;
 8                 Log.i("handler", "已經收到消息,消息what:" + id + ",id:"
 9                         + Thread.currentThread().getId());
10                 //這裏是判斷子線程是哪個,具體作什麼操做(根據我的需求寫)
11                /* if (id==1) {
12                     tv.setText("子線程1的操做"+id);
13                 }
14                 if (id==2) {
15                     adpter.notifyDataSetChanged();
16                     
17                 }*/
18             }
19         };

最後在按鈕的點擊事件啓動線程對象

 1 btn = (Button) findViewById(R.id.button1);
 2         btn.setOnClickListener(new OnClickListener() {
 3 
 4             @Override
 5             public void onClick(View v) {
 6                 /*
 7                  * MyTask mt=new MyTask(MainActivity.this);
 8                  * mt.execute(li,adpter);
 9                  */
10                 // TODO Auto-generated method stub
11                 Thread th = new Thread(doinbackground);
12                 th.start();
13                 Thread th2 = new Thread(doinbackground2);
14                 th2.start();
15             }
16         });

最後運行查看日誌blog

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息