首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法getText()必须从UI线程调用

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

Stack Overflow用户
提问于 2016-03-07 22:20:57
回答 4查看 307关注 0票数 0

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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()中,我得到了以下错误:

代码语言:javascript
运行
复制
Method getText() must called from UI thread, currently inferred thread is worker
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-07 22:44:29

调用getText()函数在onCreate中或在AsyncTask之前的某个地方,并将返回值分配给公共值。这样你就能找到他们了。

代码语言:javascript
运行
复制
public String MyeMail;
public String MyMDP;
onCreate()...
{
    MyeMail= EmailEditText.getText().toString();
    MyMDP = MdpEditText.getText().toString()
    .
    .
    .
}

它不一定在onCreate中,但必须是在用户输入EditText字段之后。您可以在单击按钮之后进行这些操作。不管怎样,现在在AsyncTask的doInBackground

代码语言:javascript
运行
复制
doInBackground...
{
    if (isFieldsEmpty(MyeMail,)) {
        result = "Empty_Field";
        return  result ;
    .
    .
    .
}

所以希望它能帮上忙!如果有用的话请告诉我。

票数 1
EN

Stack Overflow用户

发布于 2016-03-07 22:22:45

必须在主应用程序线程上调用getText()。在后台线程上正在调用doInBackground()

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

票数 1
EN

Stack Overflow用户

发布于 2016-03-07 22:47:32

AsyncTask的doInBackground()总是在一个非UI工作线程中运行,这意味着您不能访问诸如EditTextdoInBackground()中的TextView这样的UI元素。因此,如果您想在doInBackground()中访问这些,那么您可以传递AsyncTask构造函数中的这些值并使用它们,或者最好的方法是在execute()方法AsyncTask中将EmailEditText.getText().toString()MdpEditText.getText().toString()作为params传递。因此,假设您的AsyncTask名称是"ProcessTask",那么在启动AsyncTask时,请写以下内容:

代码语言:javascript
运行
复制
new ProcessTask().execute(EmailEditText.getText().toString(), MdpEditText.getText().toString());

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

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35855277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档