在 Android 中,我认为我无法从 UI 线程以外的其他线程访问 ui 对象。这就是为什么处理程序和所有在那里将细节传回 ui 线程的原因。
我尝试了下面的简单示例。我试图从创建的新线程更新进度条。有效。我以为我会异常(exception)。你能解释一下为什么我没有得到异常吗。
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();
}
}
}
}
}
最佳答案
ProgressBar 在更新进度之前内部检查它是否在 UI 线程中。
如果进度是从非 ui-thread 更新的,那么它将创建自己的 runnable,它在 UI-Thread 上运行。
if (mUiThreadId == Thread.currentThread().getId()) {
// update progress bar
} else {
// create ui thread before updating progress bar
}
请参阅link获取代码详情。
关于android - 我可以从 UI 线程以外的不同线程访问 android 小部件引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42009521/