我可以从UI线程以外的其他线程访问android小部件引用吗。。?

我可以从UI线程以外的其他线程访问android小部件引用吗。。?,android,Android,在Android中,我认为除了ui线程之外,我无法从其他线程访问ui对象。这就是为什么处理程序和所有处理程序都需要将详细信息传递回ui线程的原因 我尝试了下面的简单示例。我试图从创建的新线程更新进度条。成功了。我想我会有例外。你能解释一下为什么我没有例外吗 public class Main3Activity extends AppCompatActivity { private static final String TAG = "Main3Activity"; Threa

在Android中,我认为除了ui线程之外,我无法从其他线程访问ui对象。这就是为什么处理程序和所有处理程序都需要将详细信息传递回ui线程的原因

我尝试了下面的简单示例。我试图从创建的新线程更新进度条。成功了。我想我会有例外。你能解释一下为什么我没有例外吗

public class Main3Activity extends AppCompatActivity {

    private static final String TAG = "Main3Activity";

    Thread thread;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        thread = new Thread(new MyThread());

        progressBar  = (ProgressBar) findViewById(R.id.progressBar);
        Log.i(TAG, "run: "+Thread.currentThread().getName());

        thread.start();

    }

    class MyThread implements Runnable{

        @Override
        public void run() {
            Log.i(TAG, "run: "+Thread.currentThread().getName());
            for(int i=0; i<100; i++){
                progressBar.setProgress(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class main3活动扩展了appcompative活动{
私有静态最终字符串TAG=“Main3Activity”;
螺纹;
私人ProgressBar ProgressBar;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
线程=新线程(new MyThread());
progressBar=(progressBar)findViewById(R.id.progressBar);
Log.i(标记“run:+Thread.currentThread().getName());
thread.start();
}
类MyThread实现可运行{
@凌驾
公开募捐{
Log.i(标记“run:+Thread.currentThread().getName());

对于(int i=0;iProgressBar),在更新进度之前,内部检查进度是否在UI线程中

如果进度是从非ui线程更新的,那么它将使自己的运行在ui线程上

if (mUiThreadId == Thread.currentThread().getId()) {
// update progress bar
} else {
// create ui thread before updating progress bar
}

有关代码的详细信息,请参见。

谢谢。这很有意义。好问题很多人对此表示怀疑。