记录子线程操作UI不报错的问题

原创 2018年04月15日 22:00:34

  一次偶然的情况在Activity的onCreate方法中写了这么一段代码:

tv1 = (TextView) findViewById(R.id.tv1);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                tv1.setText("23333");
            }
        }).start();

  运行后竟然能够正确修改TextView的值而没有闪退。
  下面我们来分析一下。根据Activity的生命周期,在执行onCreate方法时应该是已经创建了DecorView和mContentParent,也就是根布局。并且在setContentView的时候把我们Activity的布局添加到了mContentView中。但是这个时候还没有执行WindowManager的add方法。也就是说Window和DecorView还没有绑定,DecorView和ViewRootImpl也没有绑定。而线程检查是在ViewRootImpl中调用的,因此在这里调用setText只是改变了text的值,然后在绑定ViewRootImpl时直接绘制成了对应的值。
  理论上来说在绑定ViewRootImpl之前子线程可以任意操作UI。
  再回顾一下为什么Google不让我们在子线程操作UI。因为多线程操作共享资源本身存在很多问题,会导致程序出现无法预料的问题。用一个线程来管理UI能够更好的对UI的状态进行预测和控制。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37988298/article/details/79954003

子线程中更新UI不报错问题

public class MainActivity extends Activity {     private TextView textview;     @Override     pro...
  • wb1211
  • wb1211
  • 2016-08-02 11:47:19
  • 674

为什么只能在主线程中操作UI?为什么子线程中setText不报错?

今天偶然看到之前写过的代码,在activity中创建了一个子线程,然后在子线程中给TextView设置了文字。想到了Android基础原理:只能在主线程中操作UI。这不是矛盾吗?然后就去翻书查资料、看...
  • snail_mac
  • snail_mac
  • 2017-06-27 10:47:42
  • 604

android 不能在子线程中更新ui的讨论和分析

问题描述  做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui...
  • zhao_zepeng
  • zhao_zepeng
  • 2016-01-26 18:54:25
  • 10846

子线程为什么不能更新UI

安卓不允许子线程更新UI是因为UI访问是没有加锁的,多个线程访问UI不是线程安全的   由源码可知,检测ui更新是否在主线程的操作是在Activity的OnResume方法中执行的 如果在子线程立刻访...
  • Mr_freeler
  • Mr_freeler
  • 2016-05-09 00:07:12
  • 1246

为什么不能在子线程中更新UI

http://www.2cto.com/kf/201410/342890.html 先放结论: 1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了...
  • cewei711
  • cewei711
  • 2016-11-04 00:09:08
  • 1139

Android开发——子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制 方法1  Act...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-08-04 17:21:34
  • 16735

基础篇-在非UI线程中更新UI元素

先了解两个概念 1、UI:User Interface的缩写,用户界面的意思。你可以不恰当的理解为我们能够看到的,操作的东西;在Android中什么才称为UI呢,可以简单的理解为View及其子类等元素...
  • super_luo
  • super_luo
  • 2015-02-09 11:04:13
  • 1485

Android中子线程真的不能更新UI吗?

Android的UI访问是没有加锁的,这样在多个线程访问UI是不安全的。所以Android中规定只能在UI线程中访问UI。但是有没有极端的情况?使得我们在子线程中访问UI也可以使程序跑起来呢?...
  • xyh269
  • xyh269
  • 2016-10-03 17:58:44
  • 9230

为什么ios中,子线程为什么不能更新UI,必须回到主线程

1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:      因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为...
  • stral
  • stral
  • 2016-09-30 15:53:40
  • 996

Android中为什么主线程更新UI,子线程执行耗时操作?

Android主线程是线程不安全的?网上文章常常有说:Android主线程是线程不安全的。我就纳闷了,线程还有安全一说? 不能说主线程是线程不安全。线程没有安全不安全这一说。而是更新UI的方法不是线...
  • liugec
  • liugec
  • 2017-12-05 15:16:26
  • 647
收藏助手
不良信息举报
您举报文章:记录子线程操作UI不报错的问题
举报原因:
原因补充:

(最多只允许输入30个字)