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機制來解決這樣的問題,請看如下代碼:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class HandlerTestActivity extends Activity {
    private TextView tv;
    private static final int UPDATE = 0;
    private Handler handler = new Handler() {
 
        @Override
        public void handleMessage(Message msg) {
            // TODO 接收消息並且去更新UI線程上的控件內容
            if (msg.what == UPDATE) {
                // Bundle b = msg.getData();
                // tv.setText(b.getString("num"));
                tv.setText(String.valueOf(msg.obj));
            }
            super.handleMessage(msg);
        }
    };
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv = (TextView) findViewById(R.id.tv);
 
        new Thread() {
            @Override
            public void run() {
                // TODO 子線程中通過handler發送消息給handler接收,由handler去更新TextView的值
                try {
                    for (int i = 0; i < 100; i++) {
                        Thread.sleep(500);
                        Message msg = new Message();
                        msg.what = UPDATE;
                        // Bundle b = new Bundle();
                        // b.putString("num", "更新後的值:" + i);
                        // msg.setData(b);
                        msg.obj = "更新後的值:" + i;
                        handler.sendMessage(msg);
                    }
                catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
 
}
        我們就通過Handler機制來處理了子線程去更新UI線程控件問題,Andrid開發中要經常用到這種機制。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章