为什么在Android 5(Lollipop)上可以直接从其他线程更改UI视图?

6 android android-5.0-lollipop

请考虑以下代码:

new Thread() {
    @Override
    public void run() {
        myTextView.setText("Some text");
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

在前Lollipop机器人上,该代码会导致CalledFromWrongThreadException异常,但为什么它在Lollipop机器人上运行良好?

测试环境:运行Android 5.1的Genymotion模拟器

代码onCreateView()Fragment类的方法中.

Kai*_*Kai 3

这是一个时间问题,例如,在 onCreate() 中插入代码不会使应用程序在 Samsung Galaxy S3 或 Android 5.1 上的 Nexus 7 2013 上崩溃。但是,如果您修改代码以使其不断更新 TextView:

    new Thread() {
        @Override
        public void run() {
            int count = 0;
            while (true) {
                SystemClock.sleep(16);
                ((TextView) findViewById(R.id.test)).setText(count++ + "");
            }
        }
    }.start();
Run Code Online (Sandbox Code Playgroud)

TextView.setText(String)然后,当无意中调用View.requestLayout();最终调用ViewRootImpl.requestLayout()实际上检查正确线程的第 18 次调用时,它会崩溃。这样做可能是为了将线程检查的开销降至最低。