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

发布时间 - 2026-01-11 01:15:30    点击率:

大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:

  1. 使用Handler消息传递机制;
  2. 使用AsyncTask异步任务;
  3. 使用runOnUiThread(action)方法;
  4. 使用Handler的post(Runnabel r)方法;

下面分别使用四种方式来更新一个TextView。

1.使用Handler消息传递机制

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 private TextView tv;
 
 Handler handler = new Handler()
 {
  public void handleMessage(android.os.Message msg) {
   if(msg.what==0x123)
   {
    tv.setText("更新后的TextView");
   }
  };
 };
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new MyThread().start();
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   //延迟两秒更新
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   handler.sendEmptyMessage(0x123);
  }
 }
}

2. 使用AsyncTask异步任务

注:更新UI的操作只能在onPostExecute(String result)方法中。

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 private TextView tv;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new Yibu().execute();
 }
 class Yibu extends AsyncTask<String, String, String>
 {

  @Override
  protected String doInBackground(String... params) {
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   return null;
  }
  @Override
  protected void onPostExecute(String result) {
   // TODO Auto-generated method stub
   tv.setText("更新后的TextView");
  }
  
 }
}

3. 使用runOnUiThread(action)方法

package com.example.runonuithreadtest;

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

public class MainActivity extends Activity {
 
 private TextView tv;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  new MyThread().start();
 }
 class MyThread extends Thread
 {
  @Override
  public void run() {
   runOnUiThread(new Runnable() {
    
    @Override
    public void run() {
     // TODO Auto-generated method stub
      try {
       //延迟两秒更新
       Thread.sleep(2000);
      } catch (InterruptedException e) {
       e.printStackTrace();
      }
      tv.setText("更新后的TextView");
    }
   });
  }
 }
}

4. 使用Handler的post(Runnabel r)方法

package com.example.runonuithreadtest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 private TextView tv;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  tv = (TextView) findViewById(R.id.tv);
  Handler handler = new Handler();
  handler.post(new Runnable(){
   @Override
   public void run() {
    try {
     //延迟两秒更新
     Thread.sleep(2000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    tv.setText("更新后的TextView");
   }

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


# android  # 异步更新ui  # 异步ui  # 更新ui  # Android异步更新UI的四种方式  # android开发教程之handler异步更新ui  # 详解android异步更新UI的几种方法  # 大家都  # 只能在  # 要想  # 四种  # 大家多多  # 总结了  # Activity  # app  # Bundle  # os  # java  # runonuithreadtest  # package  # import  # widget  # void  # handler  # Message  # handleMessage 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浅谈redis在项目中的应用  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何快速查询域名建站关键信息?  Laravel如何自定义分页视图?(Pagination示例)  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  大型企业网站制作流程,做网站需要注册公司吗?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何处理和验证JSON类型的数据库字段  Laravel怎么在Blade中安全地输出原始HTML内容  如何在阿里云部署织梦网站?  网站制作报价单模板图片,小松挖机官方网站报价?  Python图片处理进阶教程_Pillow滤镜与图像增强  高防服务器租用如何选择配置与防御等级?  详解Android——蓝牙技术 带你实现终端间数据传输  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel怎么上传文件_Laravel图片上传及存储配置  iOS验证手机号的正则表达式  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel如何发送系统通知?(Notification渠道示例)  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Laravel distinct去重查询_Laravel Eloquent去重方法  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  常州企业网站制作公司,全国继续教育网怎么登录?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  jquery插件bootstrapValidator表单验证详解  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  EditPlus 正则表达式 实战(3)  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel怎么判断请求类型_Laravel Request isMethod用法  Linux后台任务运行方法_nohup与&使用技巧【技巧】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel如何使用Blade模板引擎?(完整语法和示例)  Python正则表达式进阶教程_复杂匹配与分组替换解析  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  nginx修改上传文件大小限制的方法  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  在线教育网站制作平台,山西立德教育官网?