为什么在后台线程中更新 ProgressBar 不会抛出 CalledFromWrongThreadException

Why updating ProgressBar in background thread doesn't throw CalledFromWrongThreadException

我正在尝试复习 Handler 的概念。所以我只是创建一个线程来更新 ProgressBar 并查看它是否会抛出异常。

这是我的代码

@Override
public void onResume() {
    super.onResume();
    new Thread(){
        @Override
        public void run() {
            super.run();
            while (progressBar.getProgress() <100){
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                progressBar.setProgress(pb.getProgress()+10);
            }
        }
    }.start();
}

我的问题很简单。为什么它不抛出任何 CalledFromWrongThreadException? 如果是这样的话,我们处理进度更新的时候是不是应该忘记Handler?

https://cs.android.com/android/platform/superproject/+/android-10.0.0_r30:frameworks/base/core/java/android/widget/ProgressBar.java;l=1610

运气不好--ProgressBar 特别支持从另一个线程更新其进度。这就是它不抛出东西的原因。

但是因为正是这个操作有这个额外的支持,所以第二个问题没有。通常,您不会停止使用处理程序。对于某些情况,例如,您需要在更新进度时做另一件小事 UI。