在安卓开发中,大部分情况下是不能在子线程直接更新UI的,只能在UI线程更新UI,其根本原因在于加入在一个Activity中有多个线程去更新UI,且没有加锁机制,可能会产生界面混乱的情况,但是如果都加锁的话会导致性能下降。所以android提供了一套子线程更新UI的机制。在某些特殊的情况下是可以直接在子线程更新UI的。

布局界面只有一个textView

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.widget.TextView;public class HandlerActivity extends Activity {private TextView textView;@SuppressLint("HandlerLeak")Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {textView.setText("okok");super.handleMessage(msg);}};//第一种 handler post runnable//其本质也是发送的一个message对象private void handler1() {handler.post(new Runnable() {@Overridepublic void run() {textView.setText("ok");}});}//第二种  handler send messageprivate void handler2() {handler.sendEmptyMessage(1);}//第三种  runOnUiThreadprivate void updateUI(){runOnUiThread(new Runnable() {@Overridepublic void run() {textView.setText("okokok");}});}//第四种  view post runnableprivate void viewUI(){textView.post(new Runnable() {@Overridepublic void run() {textView.setText("okokokok");}});}@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);textView = findViewById(R.id.tv_handler);new Thread() {@Overridepublic void run() {super.run();try {Thread.sleep(2000);//handler1();//handler2();//updateUI();viewUI();} catch (InterruptedException e) {e.printStackTrace();}}}.start();}
}

以上四种方式其本质其实都是通过handler发送message去通知UI线程更新UI

直接在子线程更新UI

public class ThreadActivity extends Activity {private TextView textView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_handler);textView = findViewById(R.id.tv_handler);new Thread() {@Overridepublic void run() {super.run();textView.setText("1111");//try {//      Thread.sleep(2000);//     textView.setText("1111");//  } catch (InterruptedException e) {//     e.printStackTrace();//  }}}.start();}@Overrideprotected void onResume() {super.onResume();}
}

这段代码执行下来是可以执行的。但是如果在子线程中执行线程休眠的方法,就会爆出  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.异常。其根本原因在于android实现更新UI的对象。ViewRootImpl是在onResume方法中去初始化的,由于会先执行onCreate方法,所以此时的viewRootImpl还没有被初始化。

AndroidStudio子线程更新UI的几种方式相关推荐

  1. AndroidUI——后台线程更新UI的几种方式

    开发Android程序时经常会用到后台线程请求服务器数据,当请求完数据后更新UI时,经常遇到回调函数中和UI相关的语句无法执行,甚至有时候会抛异常. 下面的例子我会讲到三种方法更新UI,例子非常简单, ...

  2. Android子线程更新UI的方法总结

    消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.有些特殊的场景,比如我们都知道,在Android开发中,子线程不能更新UI,而主线程又不 ...

  3. android 关于关于子线程更新UI的一些事

    我们在看一些书或者博客时总是会看到一句话"android更新UI操作都是在Main主线程中,子线程中不能进行UI更新操作"那么,在子线程中真的不能进行UI的更新操作吗? //源码环 ...

  4. Android中Activity、Window、ViewRootImpl与子线程更新UI

    三者层级关系 1.Window Window是一个抽象类,唯一的实现类是PhoneWindow Window分为三种类型应用Window.子Window.系统Window.子Window无法独立存在必 ...

  5. Android为什么不能在子线程更新UI

    Android为什么不能在子线程更新UI Android为什么不能在子线程更新UI? 如果不做这个校验,是不是我也可以正常在子线程更新UI 但是google为什么要这样去设计呢 ViewRootImp ...

  6. 面试官问我:Andriod为什么不能在子线程更新UI?

    记得看文章三部曲,点赞,评论,转发. 微信搜索[程序员小安]关注还在移动开发领域苟活的大龄程序员,"面试系列"文章将在公众号同步发布. 1.前言 看完<你为什么在现在的公司不 ...

  7. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  8. [Android开发]Android更新UI的五种方式

    Android更新UI的五种方式: 1.handler.post 2.activity.runOnUiThread 3.view.post 4.handler+Thread 5.AsyncTask 下 ...

  9. C#利用Invoke和委托实现子线程更新UI(方式1)

    UI布局如下 委托定义如下: public delegate void SetMessageDelegate(string message); From1的代码如下: public partial c ...

最新文章

  1. java 折半_折半算法
  2. 记一次kubect init初始化端口占用问题
  3. mysql 1005_MYSQL使用错误 MYSQL中ERROR 1005
  4. django:bootstrap table加载django返回的数据
  5. [Java] 蓝桥杯PREV-3 历届试题 带分数
  6. 开发者应该关注的五项Web新兴技术:WebGL和SVG名列其中
  7. C Tricks(十六)—— 复制字符串
  8. JS实现动态生成二维码,并在中间插入logo
  9. 倒立摆:Simulink建模
  10. MCGS昆仑动态显示屏组态环境搭建介绍
  11. GitLab迁移升级大作战
  12. 项目管理project模板_项目管理常用的10张图表推荐
  13. !doctype html public 广告飘窗不能用了,页面广告飘窗
  14. 如何接入易班第三方登录
  15. 迷你HTTP服务器+小型博客
  16. Linux 系统编程-文件IO-文件描述符、open函数的使用、实现touch命令
  17. Ruby ERB模板注入检测
  18. userenv和sys_context函数
  19. 街头立体画的创作过程
  20. 遇见你,是最美的意外

热门文章

  1. ConGLR:Incorporating Context Graph with Logical Reasoning for Inductive Relation Prediction
  2. android 赛车 源码,android 3D风格赛车游戏源码
  3. 蓝桥杯-算法训练-跳马
  4. char与signed char, unsigned char的区别
  5. 小程序轮播图:点击放大长按保存。
  6. ormpp 项目新版本规划概述
  7. binlog回滚mysql误操作数据
  8. uniapp中使用iconfont多色图标
  9. 杀怪物(dfs)题解
  10. 如何基于微信开放接口开发企业的微信 CRM?