2016-03-07 7 views
0

Я не могу устранить эту ошибку. Пожалуйста, помогите мне. У меня есть эти два метода:Метод getText() должен быть вызван из потока пользовательского интерфейса

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 

ответ

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

Так надеюсь, что это помогает! Дайте мне знать, если это сработает.

+0

Это решение не будет работать, потому что вы получаете доступ к значениям EditText в onCreate(). Что делать, если пользователь изменяет значения перед запуском AsyncTask. –

+0

@orkundzgn благодарит много, это работа –

1

getText() должен быть вызвал основной поток приложения. doInBackground() вызывается в фоновом потоке.

Получите значения из EditText и предоставьте их AsyncTask (например, через конструктор) перед выполнением задачи.

0

AsyncTask-х doInBackground() всегда работает в режиме нон-UI рабочего потока, что означает, что вы не можете получить доступ к элементам интерфейса, как EditText, TextView в doInBackground(). SO, если вы хотите получить к ним доступ в doInBackground(), вы можете либо передать их в свой конструктор AsyncTask, либо использовать их, либо наилучшим подходом было бы передать EmailEditText.getText().toString() и MdpEditText.getText().toString() в качестве параметров в методе execute()AsyncTask. Так, скажем, если ваш 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; 
} 
0

Ваш ошибка заключается в методе doInBackground()

Вы вызываете 2 объекта EmailEditText и MdpEditText, которые являются частью потока пользовательского интерфейса внутри другого потока. И поэтому вас попросят назвать «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; 
    } 
    ... 
} 

Надеюсь, это поможет!

Смежные вопросы

 Смежные вопросы