美文网首页
线程中view.setText一定会报错吗

线程中view.setText一定会报错吗

作者: GoLearning轻松学 | 来源:发表于2022-02-10 09:56 被阅读0次
public class MainActivity extends Activity {
    private TextView textview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        textview= (TextView) findViewById(R.id.textview);

        new MyThread().start();
    }
    public class MyThread extends Thread{
        @Override
        public void run() {
            textview.setText("子线程修改的");
        }
    }
}

在子线程中一般情况下是不能刷新UI的,但有一种情况可以。
在生命周期里,我们在setCotentView里面我所创建的DecorView并没有跟activity进行绑定,我们“UI在子线程可以setText”这个情况,这个问题其实是应该再UI刷新的时候去做的,一般有价值的刷新,activity刷新,要导致Window刷新,然后Window刷新带动DecorView去刷新,再而是DecorView刷新带动整个View去刷新,应该是这么一个逻辑,再这逻辑中间里面,我们的Window都还没有DecorView,也就是说再我整个UI体系里面,你这套体系根本就不存在,activity都还没有DecorView,没有DecorView的时候,你再去set一个Text,那么这个setText的操作能够出发我整个activity的view刷新吗?它会出发刷新吗?是不会的。因为activity和window和view的关系,那么你刷新UI的时候,整个UI刷新时由window来管理的,而这个window都不存在,activity对应的window都不存在,你怎么刷新呢。
同样的,它也能在onResume里执行线程里面setText。因为onCreate->onResume这阶段decorview都还没有跟activity绑定。ActivityThread调用handleResumeActivity,里面会先会通知activity去onResume,再去执行decorview都还没有跟activity绑定。

public final class ActivityThread extends ClientTransactionHandler {
    @Override
    public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,

        final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);

         ViewManager wm = a.getWindowManager();
         View decor = r.window.getDecorView();
    }
}
    @VisibleForTesting
    public ActivityClientRecord performResumeActivity(IBinder token, boolean finalStateRequest,
            String reason) {
....
            r.activity.performResume(r.startsNotResumed, reason);
....
    }

相关文章

  • 线程中view.setText一定会报错吗

    在子线程中一般情况下是不能刷新UI的,但有一种情况可以。在生命周期里,我们在setCotentView里面我所创建...

  • foreach遍历list删除元素一定会报错?

    foreach遍历list集合删除某些元素一定会报错吗?先上一段代码: 控制台报错:java.util.Concu...

  • Hanlder源码分析(包括同步屏障,异步消息)

    1 创建Handler 众所周知,在子线程直接创建Handler一定会报错,如图 意思也很明确,必须要调用Loop...

  • 理解Android消息处理机制

    一、我们都知道Android开发中必须把所有的UI操作放在主线程中,如果直接在子线程中操作UI,APP会报错崩溃。...

  • 线程中出现异常的处理

    先看一个线程中报错的例子: 很显然,程序在控制台输出空指针,在java的多线程技术中,可以对多线程中的异常进行"捕...

  • ArrayList 和 Vector

    今天开发中遇到一个在不同线程中同时操作ArrayList的报错的问题。众所周知ArrayList是线程不安全的,后...

  • Java 主线程结束与子线程结束之间的陷阱

    问:Main 线程是守护线程吗?运行中的线程还能设置成守护线程吗? 答:main 线程是由 java 虚拟机在启动...

  • Android不在子线程更新UI

    报错 UI 的线程检查机制就已经建立了,所以在子线程更新就会报错。 子线程更新的错误定位 子线程更新的错误定位是 ...

  • iOS项目开发中Crash汇总

    错误1、 原因: 从上面的报错信息可以看出,主线程在运行的时候子线程修改了主线程UI的布局约束,在iOS开发中,所...

  • Java-3

    线程中的join()多线程中的run()和start()java中的++i操作是线程安全的吗3*0.1 == 0....

网友评论

      本文标题:线程中view.setText一定会报错吗

      本文链接:https://www.haomeiwen.com/subject/gsrphrtx.html