欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android使用Handler和Message更新UI

程序员文章站 2024-03-05 13:25:42
在android中,在非主线程中更新ui控件是不安全的,app在运行时会直接crash,所以当我们需要在非主线程中更新ui控件,那么就需要用到handler和message...

在android中,在非主线程中更新ui控件是不安全的,app在运行时会直接crash,所以当我们需要在非主线程中更新ui控件,那么就需要用到handler和message来实现
demo中,使用到一个按钮和一个textview,点击按钮之后改变textview的内容,按钮点击时候新建一个进程,在进程中对ui控件进行修改。

public class mainactivity extends activity implements onclicklistener {
  private static final int update_text = 1;
  private button send;
  private textview tv;
  
  private handler hd = new myhandler();

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    send = (button) findviewbyid(r.id.bt_sendmessage);
    tv = (textview) findviewbyid(r.id.tv_text);
    send.setonclicklistener(this);
  }

  @override
  public void onclick(view v) {
    switch (v.getid()) {
    case r.id.bt_sendmessage:
      new thread(new runnable() {
        @override
        public void run() { // 新建一个线程,并新建一个message的对象,是用handler的对象发送这个message
          message msg = new message();
          msg.what = update_text; // 用户自定义的一个值,用于标识不同类型的消息
          hd.sendmessage(msg); // 发送消息
        }
      }).start();
      break;

    default:
      break;
    }
  }
  
  // 定义一个内部类继承自handler,并且覆盖handlemessage方法用于处理子线程传过来的消息
  class myhandler extends handler{
    @override
    public void handlemessage(message msg) {
      super.handlemessage(msg);
      switch (msg.what) {
      case update_text: // 接受到消息之后,对ui控件进行修改
        tv.settext("修改成功!");
        break;

      default:
        break;
      }
    }
  }
}

理解:先在主活动中定义一个内部类,并继承自handler,并且覆盖handler中的handlemessage方法,这个方法在handler中是一个空方法,便于我们自定义消息的内容。然后在oncreate方法中,获取button并且添加点击事件,在事件中添加一个线程,在线程中,使用message类封装一个消息,然后用handler的对象发送这个消息,handler对象的handlemessage方法就会被调用,达到改变textview的内容的效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。