Android 必须从UI线程调用方法getText()

Android 必须从UI线程调用方法getText(),android,Android,我无法解决这个错误。请帮帮我。我有两种方法: public boolean isEmailValid(String email) { boolean flag; CharSequence inputStr = email.trim(); Pattern pattern = Pattern.compile(EXPRESSION, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.ma

我无法解决这个错误。请帮帮我。我有两种方法:

public boolean isEmailValid(String email) {

    boolean flag;

    CharSequence inputStr = email.trim();
    Pattern pattern = Pattern.compile(EXPRESSION,
            Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);

    if (matcher.matches())
        flag = true;
    else {

        flag = false;
    }
    return flag;

}

public boolean isFieldsEmpty(String login, String mdp) {
    Boolean result = true;
    if (login.equals("") || mdp.equals("")) {
        result = true;
    } else {
        result = false;
    }

    return result;
}

class LoginUser extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute(){

            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);
            prefs = getSharedPreferences("PFE_Prefs",MODE_PRIVATE);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            progressBar.setVisibility(View.GONE);
            switch (s) {
                case "Champs_vides":
                    Toast.makeText(getApplicationContext(), "Merci de bien vouloir remplir tous les champs, svp", Toast.LENGTH_SHORT).show();
                    EmailEditText.setText("");
                    MdpEditText.setText("");
                    break;
                case "Email_incorrect":
                    Toast.makeText(getApplicationContext(),"Merci de bien vouloir verifier votre adresse email, svp", Toast.LENGTH_SHORT ).show();
                    EmailEditText.setText("");
                    MdpEditText.setText("");
                    break;
                case "Success": //Appel a l'activité Tableau de bord
                    Intent toDashBord = new Intent(getApplicationContext(), DashBoardActivity.class);
                    startActivity(toDashBord);
                    LoginActivity.this.finish();
                    break;
                case "Echoué" :
                    Toast.makeText(getApplicationContext(),"Merci de bien vouloir verifier votre connexion, svp", Toast.LENGTH_SHORT ).show();
                    EmailEditText.setText("");
                    MdpEditText.setText("");
                    break;
            }

        }
我的问题出现在
EmailEditText.getText().toString()
中,我得到以下错误:

Method getText() must called from UI thread, currently inferred thread is worker
必须在主应用程序线程上调用
getText()
<正在后台线程上调用code>doInBackground()

在执行任务之前,从
EditText
中获取值,并将其提供给
AsyncTask
(例如,通过构造函数)。必须在主应用程序线程上调用
getText()
<正在后台线程上调用code>doInBackground()


在执行任务之前,从
EditText
中获取值,并将其提供给
AsyncTask
(例如,通过构造函数)。

onCreate
AsyncTask
之前的某个地方调用所有
getText()
函数,并将返回值分配给公共值。所以你可以联系到他们

public String MyeMail;
public String MyMDP;
onCreate()...
{
    MyeMail= EmailEditText.getText().toString();
    MyMDP = MdpEditText.getText().toString()
    .
    .
    .
}
它不必在
onCreate
中,但必须在用户输入
EditText
字段之后。您可以在单击按钮后执行这些操作。无论如何,现在在AsyncTask的
doInBackground

protected String doInBackground(String... params) {

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(EmailEditText.getText().toString(),MdpEditText.getText().toString())){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(EmailEditText.getText().toString().trim())){
            result = "Wrong_mail";
            return  result ;
        }
        return null;
    }
doInBackground...
{
    if (isFieldsEmpty(MyeMail,)) {
        result = "Empty_Field";
        return  result ;
    .
    .
    .
}

所以希望它能帮上忙!让我知道它是否有效。

onCreate
AsyncTask
之前的某个地方调用所有
getText()
函数,并将返回值分配给公共值。所以你可以联系到他们

public String MyeMail;
public String MyMDP;
onCreate()...
{
    MyeMail= EmailEditText.getText().toString();
    MyMDP = MdpEditText.getText().toString()
    .
    .
    .
}
它不必在
onCreate
中,但必须在用户输入
EditText
字段之后。您可以在单击按钮后执行这些操作。无论如何,现在在AsyncTask的
doInBackground

protected String doInBackground(String... params) {

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(EmailEditText.getText().toString(),MdpEditText.getText().toString())){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(EmailEditText.getText().toString().trim())){
            result = "Wrong_mail";
            return  result ;
        }
        return null;
    }
doInBackground...
{
    if (isFieldsEmpty(MyeMail,)) {
        result = "Empty_Field";
        return  result ;
    .
    .
    .
}

所以希望它能帮上忙!让我知道它是否有效。

异步任务的
doInBackground()
始终在非UI工作线程中运行,这意味着您无法在
doInBackground()
中访问诸如
EditText
TextView
之类的UI元素。因此,如果您想在
doInBackground()
中访问它们,那么您可以在AsyncTask的构造函数中传递它们并使用它们,或者最好的方法是将
EmailEditText.getText().toString()
MdpEditText.getText().toString()
作为
execute()中的参数传递
异步任务的方法。 因此,假设您的
AsyncTask
名称为“
ProcessTask
”,那么在启动
AsyncTask
时,写下以下内容:

new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());
在这种情况下,您的AsyncTask应该更改为:

class ProcessTask extends AsyncTask<String,Void,Void >{
      @Override
      protected File doInBackground(String... params) {
        String emailEditText = params[0];
        String mdpEditText = params[1];

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(emailEditText,mdpEditText)){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(emailEditText.trim())){
            result = "Wrong_mail";
            return  result ;
        }



        return null;
}
类ProcessTask扩展了AsyncTask{
@凌驾
受保护的文件doInBackground(字符串…参数){
字符串emailEditText=params[0];
字符串mdpEditText=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(emailEditText,mdpEditText)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(emailEditText.trim()),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}

AsyncTask的
doInBackground()
始终在非UI工作线程中运行,这意味着您无法访问
EditText
TextView
中的
等UI元素
,然后您可以将它们传递到AsyncTask的构造函数中并使用它们,或者最好的方法是将
EmailEditText.getText().toString()
MdpEditText.getText().toString()作为
AsyncTask
execute()
方法中的参数传递。 因此,假设您的
AsyncTask
名称为“
ProcessTask
”,那么在启动
AsyncTask
时,写下以下内容:

new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());
在这种情况下,您的AsyncTask应该更改为:

class ProcessTask extends AsyncTask<String,Void,Void >{
      @Override
      protected File doInBackground(String... params) {
        String emailEditText = params[0];
        String mdpEditText = params[1];

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(emailEditText,mdpEditText)){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(emailEditText.trim())){
            result = "Wrong_mail";
            return  result ;
        }



        return null;
}
类ProcessTask扩展了AsyncTask{
@凌驾
受保护的文件doInBackground(字符串…参数){
字符串emailEditText=params[0];
字符串mdpEditText=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(emailEditText,mdpEditText)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(emailEditText.trim()),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}

您的错误在于方法doInBackground()

您正在调用两个对象EmailEditText和MdpEditText,它们是另一个线程中UI线程的一部分。 因此,要求您从UI线程调用“EmailEditText.getText().toString()”

你想做的并不是从你发布的片段中完全清楚

但这个例子可能会有所帮助: 在OnCreate()中,有如下内容

protected void onCreate(Bundle savedInstanceState) {
...
String parameters= new String[2];//make this global if you aren't calling your AsyncTask in onCreate()
parameters[1]=EmailEditText.getText().toString();
parameters[2]=MdpEditText.getText().toString();
...
}
并按如下方式调用您的AsyncTask:

new YourTask().execute(parameters);
private class YourTask extends AsyncTask<String, Void, String> {

    ...
    @Override
    protected String doInBackground(String... params) {

        String email = params[0];
        String mdp= params[1];

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(email,mdp)){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(email.trim())){
            result = "Wrong_mail";
            return  result ;
        }

        return null;
    }
    ...
}
而异步任务的声明如下所示:

new YourTask().execute(parameters);
private class YourTask extends AsyncTask<String, Void, String> {

    ...
    @Override
    protected String doInBackground(String... params) {

        String email = params[0];
        String mdp= params[1];

        int success = 0;
        String result = "";
        JSONObject json ;
        WebCalls webCalls = new WebCalls();
        JSONObject jsonUser;
        User tempUser ;

        if (isFieldsEmpty(email,mdp)){
            result = "Empty_Field";
            return  result ;
        }else if (!isEmailValid(email.trim())){
            result = "Wrong_mail";
            return  result ;
        }

        return null;
    }
    ...
}
YourTask扩展AsyncTask的私有类{
...
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串email=params[0];
字符串mdp=params[1];
int成功=0;
字符串结果=”;
JSONObject json;
WebCalls WebCalls=新的WebCalls();
JSONObject jsonUser;
用户临时用户;
if(isFieldsEmpty(电子邮件,mdp)){
结果=“空字段”;
返回结果;
}如果(!isEmailValid(email.trim())),则为else{
结果=“错误的邮件”;
返回结果;
}
返回null;
}
...
}

希望这有帮助!!

您的错误在于方法doInBackground()

您正在调用2个对象EmailEditText和MdpEditText,它们是UI线程i的一部分