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

时间:2016-03-07 22:20:58

标签: android

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

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;
            }

        }

方法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;
    }

我的问题出在EmailEditText.getText().toString(),我收到以下错误:

Method getText() must called from UI thread, currently inferred thread is worker

4 个答案:

答案 0 :(得分:1)

必须在主应用程序线程上调用

getText()。正在后台线程上调用doInBackground()

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

答案 1 :(得分:1)

getText()之前或onCreate之前的某个地方呼叫所有AsyncTask个功能,并将返回值分配给公共值。所以你可以联系他们。

public String MyeMail;
public String MyMDP;
onCreate()...
{
    MyeMail= EmailEditText.getText().toString();
    MyMDP = MdpEditText.getText().toString()
    .
    .
    .
}

它不必位于onCreate,但必须在用户输入EditText字段后。您可以在点击按钮后执行这些操作。无论如何,现在在你的AsyncTask doInBackground

doInBackground...
{
    if (isFieldsEmpty(MyeMail,)) {
        result = "Empty_Field";
        return  result ;
    .
    .
    .
}

所以希望它有所帮助!如果有效,请告诉我。

答案 2 :(得分:0)

AsyncTask的doInBackground()始终在非UI工作线程中运行,这意味着您无法访问EditText中的TextViewdoInBackground()等UI元素。那么,如果你想在doInBackground()中访问它们,那么你可以在AsyncTask的构造函数中传递它们并使用它们,或者最好的方法是传递EmailEditText.getText().toString()和{{1} } MdpEditText.getText().toString() execute()方法中的params。 因此,如果您的AsyncTask名称是&#34; AsyncTask&#34;,那么当您启动ProcessTask时,请写下:

AsyncTask

在这种情况下,您的AsyncTask应该更改为:

new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());

答案 3 :(得分:0)

您的错误在于方法doInBackground()

您正在调用2个对象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);

虽然你的AsyncTask的声明是这样的:

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;
    }
    ...
}

希望这有帮助!!