必须从UI线程调用方法setText(),当前推断的线程是辅助线程

时间:2019-08-20 18:11:48

标签: android-studio android-asynctask

我正在Android Studio中创建一个项目,在某个地方我必须使用AsyncTask,但是当我尝试在尝试捕获中设置setText时,我得到了一个错误:“方法setText()必须从UI线程调用,当前推断的线程是worker” 该怎么办? 这是我的代码的一些印刷品:

onCreate and onClick

Validate user on AsyncTask

2 个答案:

答案 0 :(得分:0)

如果您尝试在单独的线程上更新任何UI组件,则会出现该错误。我有一个帮助程序函数,可用于在UI线程上运行特定内容,这是重要的一点:

Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
   @Override
    public void run() {
        txt_Error.setText("Sorry!! Incorrect Username or Password");
    }
});

答案 1 :(得分:0)

该错误表明您无法在此处调用txt_Error.setText()方法,因为AsyncTask DoInBackGround 在后台运行,也就是说,txt_Error.setText()方法只能从以下位置调用IU线程。

您可以做的是在 DoInBackground 中调用此方法publishProgress(2 parameter);,然后在AsyncTask中按 ALT + O 添加此方法onProgressUpdate(2 parameter)

onProgressUpdate(2 parameter)方法在主线程或IU线程中运行,因此每次您在 DoInBackground 中调用publishProgress(2 parameter);时,都会触发onProgressUpdate()

另一个重要的事情是,publishProgress(2 parameter);方法send和onProgressUpdate(2 parameter)方法获取您在private class validateUserTask extends AsyncTask <1 parameter, 2 parameter, 3 parameter>开头建立的第二个参数。

示例:

            new AsyncTask<Integer,String,Void>(){

                @Override
                protected Void doInBackground(Integer... integers) {

                       *can call this method wherever you want here*

                        publishProgress(string);


                    return null;
                }
                @Override
                protected void onProgressUpdate(final String... values) {

                            text.setText(values[0]);
                }

            }.execute();

注意:我只是用一种方法来做AsyncTask ...(更容易)