runOnUiThread和Handler机制更新UI

来源:互联网 发布:刷推广注册软件 编辑:程序博客网 时间:2024/06/05 14:20

一.Handler机制更新UI

1)定义了一个整型常量 UPDATE_TEXT,用于表示更新 TextView 这个动作。然后新增一个 Handler 对象,并重写父类的 handleMessage 方法,在这里对具体的 Message进行处理。如果发现 Message 的 what 字段的值等于 UPDATE_TEXT,就将 TextView 显示的内容改成Hello World。

    private static final int UPDATE_TEXT = 1;    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case UPDATE_TEXT:                    text.setText("Hello World");                    break;                default:                    break;            }        }    };

2)创建一个 Message(android.os.Message)对象,并将它的 what 字段的值指定为 UPDATE_TEXT,然后调用 Handler 的 sendMessage()方法将这条Message 发送出去。很快,Handler 就会收到Message,并在 handleMessage()方法中对它进行处理。注意此时 handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可以放心地在这里进行 UI 操作。接下来对 Message 携带的 what 字段的值进行判断,如果等于UPDATE_TEXT,就将 TextView 显示的内容改成 Hello World。

    new Thread(new Runnable() {        @Override        public void run() {            Message message = new Message();            message.what = UPDATE_TEXT;            handler.sendMessage(message); // 将Message对象发送出去        }    }).start();

ps:Android 中的异步消息处理

Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue 和
Looper。

  1. Message
    Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。使用Message 的 what 字段,除此之外还可以使用 arg1 和 arg2 字段来携带一些整型数据,使用 obj 字段携带一个 Object 对象。
  2. Handler
    Handler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用 Handler 的 sendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到 Handler 的 handleMessage()方法中。
  3. MessageQueue
    MessageQueue 是消息队列的意思,它主要用于存放所有通过 Handler 发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个 MessageQueue对象。
  4. Looper
    Looper 是每个线程中的 MessageQueue 的管家,调用 Looper 的 loop()方法后,就会进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将它取出,并传递到 Handler 的 handleMessage()方法中。每个线程中也只会有一个 Looper 对象。
    runOnUiThread更新UI

二.runOnUiThread更新UI

runOnUiThread更新UI更加方便简洁,这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作时发布到事件队列的UI线程。

runOnUiThread(new Runnable() {            @Override            public void run() {                text.setText("Hello World");            }        });
阅读全文
1 0
原创粉丝点击