根据我的基本知识,我们无法从工作线程更新UI。 我尝试下面的代码,它能够从异步任务更新到UI。
我的理解是错误的。从这段代码中,我得到的印象是我们可以从后台线程更新UI。仅在烤面包的情况下会失败。剩下的所有UI操作我都可以从后台线程执行。 有人可以清除我的声音吗?
主要活动
public class MainActivity extends AppCompatActivity {
TextView textView;
SeekBar progressBar;
ConstraintLayout constraintLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.txtview);
progressBar = findViewById(R.id.prg);
constraintLayout = findViewById(R.id.con);
AsyncTaskThread asyncTaskThread = new AsyncTaskThread();
asyncTaskThread.execute();
}
public class AsyncTaskThread extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
textView.setText("Hi Heloo");
progressBar.setIndeterminate(false);
progressBar.setMax(100);
progressBar.setProgress(50);
return null;
}
}
}
答案 0 :(得分:0)
在onCreate
方法中,您的视图尚未布局并在屏幕上可见,它们只是内存中的Java对象,当时AsyncTask
只是在其上设置属性。
现在将代码更改为
public class MainActivity extends AppCompatActivity {
TextView textView;
SeekBar progressBar;
ConstraintLayout constraintLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.txtview);
progressBar = findViewById(R.id.prg);
constraintLayout = findViewById(R.id.con);
// TODO: Add this code
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// At this time, this view is lay out and visible on screen.
AsyncTaskThread asyncTaskThread = new AsyncTaskThread();
asyncTaskThread.execute();
}
});
}
public class AsyncTaskThread extends AsyncTask {
@Override
protected Object doInBackground(Object[] objects) {
textView.setText("Hi Heloo");
progressBar.setIndeterminate(false);
progressBar.setMax(100);
progressBar.setProgress(50);
return null;
}
}
}
结果,您的应用始终会因消息而崩溃
android.view.ViewRootImpl $ CalledFromWrongThreadException:仅 创建视图层次结构的原始线程可以触摸其视图。