在Android開發中,有主線程(UI線程)和工做線程(Worker線程)之分,兩個線程是相互獨立的,並不能相互訪問(主線程主要負責UI的更新,不能進行耗時的操做,工做線程主要負責耗時的操做,但不能進行UI的更新),因此要在兩個線程之間進行數據傳遞,就須要Handler做爲傳遞數據的橋樑。每個Handler對象,都與獨立的線程以及線程的消息隊列有關。本文僅供學習分享使用。網絡
以下圖所示:併發
建立一個內部類繼承Handleride
1 /* 2 建立一個內部Handler類 3 */ 4 class NetworkHandler extends Handler{ 5 6 @Override 7 public void handleMessage(Message msg) { 8 Log.i("DemoHandler", "run: thread id2="+Thread.currentThread().getName()); 9 String s = (String) msg.obj; 10 txtInfo.setText(s); 11 } 12 }
建立一個內部類,繼承Threadoop
1 /* 2 建立一個線程內部類 3 */ 4 class NetworkThread extends Thread{ 5 @Override 6 public void run() { 7 Log.i("DemoHandler", "run: thread id1="+Thread.currentThread().getName()); 8 //模擬網絡獲取,當執行時休眠2秒鐘 9 try { 10 Thread.sleep(2*1000); 11 } catch (InterruptedException e) { 12 e.printStackTrace(); 13 } 14 //經過handler將線程數據,發送到消息隊列中 15 //1. Looper將消息隊列中的消息對象取出。 16 //2. Looper找到消息對象對應的Handler對象 17 //3. Looper將會調用handler對象中的handleMessage(Msg)方法,處理對象 18 String s="這是一個線程中的數據"; 19 Message msg=handler.obtainMessage(); 20 msg.what=1; 21 msg.obj=s; 22 handler.sendMessage(msg); 23 } 24 }
啓動線程學習
1 public void click_me(View v){ 2 //點擊事件中啓動一個線程 3 Thread thread=new NetworkThread(); 4 thread.start(); 5 }
調試輸出信息(兩個分屬不一樣的線程)spa
1 04-25 22:56:37.424 18601-18786/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-4 2 04-25 22:56:39.425 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main 3 04-25 22:56:55.491 18601-18800/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-5 4 04-25 22:56:57.492 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main
大多數狀況下,在worker thread中修改view是不能夠的,小部分是能夠的,如progressbar 。線程