在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
}
有关代码详细信息,请参阅链接。