一般情况下我们都说子线程不能更新UI,这里说的子线程可以更新UI,只是为了探讨子线程更新UI这个问题,第三种情况实现的子线程更新UI感觉并没有太大的使用意义,只是为了深刻认识更新UI的问题。
看下这个异常

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这个异常为何不是
Only the main thread that created a view hierarchy can touch its views
异常中是 original thread, 为何不是 main thread ?说明子线程是可以更新UI的

一、子线程间接更新UI

这种情况其实也是UI线程更新的,并不是真正意义上的更新UI
1、Handler
2、view.post
3、view.posDelay
4、AsyncTask

二、子线程直接更新UI

1、在onCreate中的子线程更新UI,只是钻了空子。

new Thread(new Runnable() {@Overridepublic void run() {tx.setText("non-UiThread update textview");}}).start();

三、子线程更新UI

可以认为这一种是真正的子线程更新UI
看如下代码

@Overrideprotected void onResume() {loadResImage();textView.postDelayed(new Runnable() {@Overridepublic void run() {updateSonThread();}},3000);Toast.makeText(this, "xxxxxxxxxxx", Toast.LENGTH_SHORT).show();}
private void updateSonThread(){new Thread(new Runnable() {@Overridepublic void run() {Looper.prepare();TextView tx = new TextView(MainActivity.this);tx.setText("non-UiThread update textview");tx.setTextColor(Color.BLUE);WindowManager windowManager = MainActivity.this.getWindowManager();WindowManager.LayoutParams params = new WindowManager.LayoutParams(200, 200, 200, 200, WindowManager.LayoutParams.FIRST_SUB_WINDOW,WindowManager.LayoutParams.TYPE_TOAST, PixelFormat.OPAQUE);windowManager.addView(tx, params);Looper.loop();}}).start();}

一定要有Looper.prepare();以及 Looper.loop(); 原因还未知,有知道的可以留言

Android子线程真的不能更新UI么
可能是全网最简单透彻的安卓子线程更新 UI 解析
Android 非主线程更新UI 实例
android 在非UI线程更新UI仍然成功原因深入剖析
Android 在子线程中更新UI
面试官:Android 子线程更新UI了解吗?
Android在子线程中更新Activity中UI的方法
Android 在工作线程(非主线程)更改UI组件
Android进阶:六、在子线程中直接使用 Toast 及其原理
Android在非UI线程中显示Toast
一定要有looper原因:
如果没有,在API29 模拟器中报如下错误,同时应用闪退

    --------- beginning of crash
2020-03-06 18:43:42.911 10347-11311/com.im.test E/AndroidRuntime: FATAL EXCEPTION: Thread-2Process: com.im.test, PID: 10347java.lang.RuntimeException: Can't create handler inside thread Thread[Thread-2,5,main] that has not called Looper.prepare()at android.os.Handler.<init>(Handler.java:207)at android.os.Handler.<init>(Handler.java:119)at android.view.ViewRootImpl$ViewRootHandler.<init>(ViewRootImpl.java:4340)at android.view.ViewRootImpl.<init>(ViewRootImpl.java:4638)at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:377)at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)at com.im.test.MainActivity$4.run(MainActivity.java:235)at java.lang.Thread.run(Thread.java:919)
2020-03-06 18:43:42.934 10347-11311/com.im.test I/Process: Sending signal. PID: 10347 SIG: 9

在创建ViewRootImpl对象的时候,会创建ViewRootHandler 对象,ViewRootHandler继承于Handler,如果Handler所在的线程没有Looper,会报错。应用闪退
刚开始使用华为荣耀手机,Android 8.0系统,代码中不加Looper ,子线程中的界面不显示,但是应用不会闪退,也不会报任何错误,就是一直不显示。
建议大家在研究问题时候,最好使用google模拟器,对应模拟器系统版本和你自己 编译使用的Android SDK版本保持一致,如Android 9.0 使用 API 29的系统编译,便于DEBUG跟踪源码,分析问题。
市面上的手机厂商把Android系统都给改了,影响研究。
关于Toast不能在没有Looper的子线程使用
死磕Android_View工作原理你需要知道的一切
更新于2020年3月6日 18:55

Android 子线程更新UI相关推荐

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

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

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

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

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

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

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

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

  5. AndroidStudio子线程更新UI的几种方式

    在安卓开发中,大部分情况下是不能在子线程直接更新UI的,只能在UI线程更新UI,其根本原因在于加入在一个Activity中有多个线程去更新UI,且没有加锁机制,可能会产生界面混乱的情况,但是如果都加锁 ...

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

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

  7. Android 子线程更新主线程UI视图

    消息机制,对于Android开发者来说,应该是非常熟悉.对于处理有着大量交互的场景,采用消息机制,是再好不过了.在Android开发中,子线程不能更新主线程UI,而主线程又不能进行耗时操作(例:网络请 ...

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

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

  9. android notifydatasetchanged 不起作用,为什么android子线程更新数据再调用notifyDataSetChanged没有效果...

    第一种可以更新 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...

  10. pyqt5 子线程更新ui

    from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * import time''' 信号 ...

最新文章

  1. python可以干嘛知乎-一行Python代码能做什么?
  2. 乐易家智能机器人价格_安川焊接机器人价格多少钱?核心是质量好
  3. es6 Map、Set和Array.from()
  4. MySQL学习笔记(三)
  5. linux c之通过popen执行shell命令
  6. [Silverlight]使用PagedCollectionView配合复选框实现动态筛选的解决方案
  7. 阿里巴巴合伙人闻佳:创新背后的文化与组织
  8. 数学与计算机科学学院宣传词,【榜样人物】筑梦前行 不负韶华——数学与计算机科学学院姚彬彬同学的考研心路...
  9. django前后端结合_Vue+Django前后端项目构建
  10. (4.14)mysql备份还原——mysql物理热备工具之ibbackup
  11. chap1统计学习及监督学习
  12. 探讨破解3G今日困局之策
  13. 计算机本科毕设答辩经验
  14. python将多个列表合并_Python中将两个或多个list合成一个list的方法小结
  15. 【面试】2019工商银行软件开发中心(上海)笔面试记录
  16. SCAU------8615 快乐
  17. 图标.svg html怎么换颜色,如何改变SVG图像的颜色使用CSS(jQuery SVG图像替换)?
  18. 13-新手小白如何选购笔记本电脑?
  19. 如何用PS的切片工具切出想用的图片
  20. 超好看的二次元透明网站登录页模板

热门文章

  1. 10bit色深灰度图彩色图加载显示
  2. java计算机毕业设计咖啡馆管理系统源程序+mysql+系统+lw文档+远程调试
  3. 拍牌神器是怎样炼成的(一)--- 键鼠模拟之WinAPI
  4. c语言编写dxf文件吗,判断dxf文件的版本
  5. UNIX网络编程---守护进程和inetd超级服务器(十三)
  6. oppo计算机找不到,oppo手机和电脑连接不上怎么办只显示充电(原来这个功能没有打开)...
  7. B - Gary's Calculator
  8. 笔记本安装双系统教程
  9. css3动画2D|3D
  10. MacOS brew 仓库URL源替换方法