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

详解Android UI更新的几种方法

程序员文章站 2023-08-13 15:02:53
前言 在android开发中,界面ui的更新都是在主线程来完成的。线程分为主线程(main thread,简称mt)和工作线程(work thread,简...

前言

在android开发中,界面ui的更新都是在主线程来完成的。线程分为主线程(main thread,简称mt)和工作线程(work thread,简称wt),我们通常会在wt中执行一些比较耗时的操作,比如下载,网络,缓存等,然后在将结果发送给mt进行ui的更新操作。如果是在wt进行ui的更新,则会抛出异常,android.view.viewroot$calledfromwrongthreadexception: only the original thread that created a view hierarchy can touch its views.(只有创建这个view的原始线程才能修改这个view)。

在bt搜索、wifi搜索、其他需要更新view的ui过程中,很多是采用广播的方式通知搜索的结果,实时的显示到listview中进行ui的更新操作。通常会使用以下几种方式进行ui的更新:handler,runonuithread,子线程发送message。

一、activity.runonuithread

利用activity.runonuithread(runnable)把更新ui的代码创建在runnable中,然后在需要更新 ui时,把这个runnable对象传给activity.runonuithread(runnable)。这样runnable对像就能在ui程序中被调用。如果当前线程是ui线程,那么行动是立即执行。如果当前线程不是ui线程,操作是发布到事件队列的ui线程。

mactivity.runonuithread(new runnable() {
  @override
  public void run() {
    log.e(tag, "开始添加设备!");
    adddevice(device);
  }
});

二、handler.post(runnable)

handler.post(new runnable() {
  @override
  public void run() {
    adddevice(device);
  }
});

三、子线程发送message

首先在需要执行更新的位置添加以下代码

new thread(new runnable() {
  @override
  public void run() {
    //message msg = new message();
    //msg.what = 0x06;
    //handler.sendmessage(msg);
    handler.sendemptymessage(0x06);
  }
}).start();

然后进入handler下进行处理

final handler handler = new handler() {
  @override
  public void handlemessage(message msg) {
    switch (msg.what) {
        case 0x06:
          adddevice(device);
        break;
      default:
        break;
    }
    super.handlemessage(msg);
  }
};

以上三种方法都可以实现ui的更新,掌握哪种方式取决于代码中的叠加度,不过个人推荐使用方法一。希望对大家的学习有所帮助,也希望大家多多支持。