• Android更新主线程UI的两种方式handler与runOnUiThread()


    在android开发过程中,耗时操作我们会放在子线程中去执行,而更新UI是要主线程(也叫做:UI线程)来更新的,自然会遇到如何更新主线程UI的问题。如果在主线程之外的线程中直接更新页面显示常会报错。抛出异常:android.view.ViewRoot.CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

    为什么要有handler机制?
    handler的作用:与其他线程协同工作,接收其他线程的消息并通过接收到的消息更新主UI线程的内容。
    handler的原理:
    andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。   
    1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 whille死循环  
    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
    3)Message Queue(消息队列):用来存放线程放入的消息。
    4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;

    public class MainActivity extends Activity {

    protected static final int MSG_ONE = 1;
    protected static final int MSG_TWO = 2;

    private Handler handler = new Handler() {
    public void handleMessage(Message msg) {
    switch (msg.what) {
    case MSG_ONE:
    // 执行1的操作
    break;
    case MSG_TWO:
    // 执行2的操作
    break;
    };
    }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 耗时操作要在子线程中操作
    new Thread() {
    public void run() {
    Message message = Message.obtain(); //获取消息的载体

    if (condition) {
    message.what = MSG_ONE;
    } else {
    message.what = MSG_TWO;
    }
    handler.sendMessage(message);
    };
    }.start();
    }

    }

    package com.itheima.zhbj;

    import android.app.Activity;
    import android.os.Bundle;

    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 耗时操作要在子线程中操作
    new Thread() {
    public void run() {

    //执行耗时操作

    //更新主线程UI
    runOnUiThread(new Runnable() {
    @Override
    public void run() {

    }
    });
    };
    }.start();
    }

    }

  • 相关阅读:
    Python len() 方法
    Python join() 方法
    Python isupper() 方法
    使用quartz进行容器启动时登陆接口服务器和接口服务器进行心跳连接
    实现锁死的有滚动条的div的表格(datagird)
    使用spring的事务的三种方法
    webservice系统学习笔记7-使用handler实现过滤器/拦截器效果
    webservice系统学习笔记7-异常处理
    webservice系统学习笔记6-使用soap的header传递消息
    JSTL fmt:formatNumber 数字、货币格式化
  • 原文地址:https://www.cnblogs.com/zhaoleigege/p/5477352.html
Copyright © 2020-2023  润新知