A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ERGUANGLI 中级黑马   /  2016-5-7 10:44  /  693 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

直接在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机制来解决这样的问题,请看如下代码:
[size=1em]
[color=white !important][size=1em]?

[size=1em]1

[size=1em]2

[size=1em]3

[size=1em]4

[size=1em]5

[size=1em]6

[size=1em]7

[size=1em]8

[size=1em]9

[size=1em]10

[size=1em]11

[size=1em]12

[size=1em]13

[size=1em]14

[size=1em]15

[size=1em]16

[size=1em]17

[size=1em]18

[size=1em]19

[size=1em]20

[size=1em]21

[size=1em]22

[size=1em]23

[size=1em]24

[size=1em]25

[size=1em]26

[size=1em]27

[size=1em]28

[size=1em]29

[size=1em]30

[size=1em]31

[size=1em]32

[size=1em]33

[size=1em]34

[size=1em]35

[size=1em]36

[size=1em]37

[size=1em]38

[size=1em]39

[size=1em]40

[size=1em]41

[size=1em]42

[size=1em]43

[size=1em]44

[size=1em]45

[size=1em]46

[size=1em]47

[size=1em][size=1em]public class HandlerTestActivity extends Activity {
[size=1em]    private TextView tv;
[size=1em]    private static final int UPDATE = 0;
[size=1em]    private Handler handler = new Handler() {

[size=1em]        @Override
[size=1em]        public void handleMessage(Message msg) {
[size=1em]            // TODO 接收消息并且去更新UI线程上的控件内容
[size=1em]            if (msg.what == UPDATE) {
[size=1em]                // Bundle b = msg.getData();
[size=1em]                // tv.setText(b.getString("num"));
[size=1em]                tv.setText(String.valueOf(msg.obj));
[size=1em]            }
[size=1em]            super.handleMessage(msg);
[size=1em]        }
[size=1em]    };

[size=1em]    /** Called when the activity is first created. */
[size=1em]    @Override
[size=1em]    public void onCreate(Bundle savedInstanceState) {
[size=1em]        super.onCreate(savedInstanceState);
[size=1em]        setContentView(R.layout.main);
[size=1em]        tv = (TextView) findViewById(R.id.tv);

[size=1em]        new Thread() {
[size=1em]            @Override
[size=1em]            public void run() {
[size=1em]                // TODO 子线程中通过handler发送消息给handler接收,由handler去更新TextView的值
[size=1em]                try {
[size=1em]                    for (int i = 0; i < 100; i++) {
[size=1em]                        Thread.sleep(500);
[size=1em]                        Message msg = new Message();
[size=1em]                        msg.what = UPDATE;
[size=1em]                        // Bundle b = new Bundle();
[size=1em]                        // b.putString("num", "更新后的值:" + i);
[size=1em]                        // msg.setData(b);
[size=1em]                        msg.obj = "更新后的值:" + i;
[size=1em]                        handler.sendMessage(msg);
[size=1em]                    }
[size=1em]                } catch (InterruptedException e) {
[size=1em]                    e.printStackTrace();
[size=1em]                }
[size=1em]            }
[size=1em]        }.start();
[size=1em]    }

[size=1em]}




        我们就通过Handler机制来处理了子线程去更新UI线程控件问题,Andrid开发中要经常用到这种机制。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马