能够从后台线程更新UI

时间:2019-02-27 11:42:37

标签: java android

根据我的基本知识,我们无法从工作线程更新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;
    }
}
}

1 个答案:

答案 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:仅   创建视图层次结构的原始线程可以触摸其视图。