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



在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();
                }
            }
        }
    }
}
进度

栏在更新进度之前在内部检查它是否在UI线程中。

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

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

有关代码详细信息,请参阅链接。

最新更新