Android Handler簡單講解

直接在UI線程中開啓子線程來更新TextView顯示的內容,運行程序我們會發現,如下錯 誤:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.翻譯過來就是:只有創建這個控件的線程才能去更新該控件的內容。
    所有的UI線程要去負責View的創建並且維護它,例如更新冒個TextView的顯示,都必須在主線程中去做,我們不能直接在UI線程中去創建子線程,要利用消息機制:handler,如下就是handler的簡單工作原理圖:
Android中的Handler機制
既然android給我們提供了Handler機制來解決這樣的問題,請看如下代碼:
01 public class HandlerTestActivity extends Activity {
02     private TextView tv;
03     private static final int UPDATE = 0;
04     private Handler handler = new Handler() {
05  
06         @Override
07         public void handleMessage(Message msg) {
08             // TODO 接收消息並且去更新UI線程上的控件內容
09             if (msg.what == UPDATE) {
10                 // Bundle b = msg.getData();
11                 // tv.setText(b.getString("num"));
12                 tv.setText(String.valueOf(msg.obj));
13             }
14             super.handleMessage(msg);
15         }
16     };
17  
18     /** Called when the activity is first created. */
19     @Override
20     public void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.main);
23         tv = (TextView) findViewById(R.id.tv);
24  
25         new Thread() {
26             @Override
27             public void run() {
28                 // TODO 子線程中通過handler發送消息給handler接收,由handler去更新TextView的值
29                 try {
30                     for (int i = 0; i < 100; i++) {
31                         Thread.sleep(500);
32                         Message msg = new Message();
33                         msg.what = UPDATE;
34                         // Bundle b = new Bundle();
35                         // b.putString("num", "更新後的值:" + i);
36                         // msg.setData(b);
37                         msg.obj = "更新後的值:" + i;
38                         handler.sendMessage(msg);
39                     }
40                 catch (InterruptedException e) {
41                     e.printStackTrace();
42                 }
43             }
44         }.start();
45     }
46  
47 }
        我們就通過Handler機制來處理了子線程去更新UI線程控件問題,Andrid開發中要經常用到這種機制。
發佈了1 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章