Как использовать doInBackground в Android для показа сообщения об ошибке - PullRequest
1 голос
/ 16 марта 2012

Здравствуйте, я использую AsyncTask для вызова веб-службы. Это работает нормально, когда я ввожу правильное имя пользователя и пароль, когда я ввожу неверно, то как его сообщение не правильно, но в моем коде в области doInBackground его бросок экспозиции или приложение грубо закрытый класс LoginTask расширяет AsyncTask {

    private final ProgressDialog dialog = new ProgressDialog(login.this); 

    protected void onPreExecute() { 

            this.dialog.setMessage("Logging in..."); 
            this.dialog.show(); 
    } 


    protected Void doInBackground(final Void... unused) { 
        String auth=calllogin(Username,Passowrd); 
        cls_constant.userid=auth;
        if(auth.equals("0"))
        {

        TextView errorTextview=(TextView)findViewById(R.id.tv_error);
        errorTextview.setText("Username & Password incorrect.");
        }
        else {

        Intent intnt=new Intent(getBaseContext(), aftersignin.class);
        startActivity(intnt);
        }
        return null; // don't interact with the ui! 
    } 


    protected void onPostExecute(Void result)  
    { 

            if (this.dialog.isShowing()) 
            { 
            this.dialog.dismiss(); 
            }


     } 

Я не хочу показывать ошибку, как это, но я не знаю, что я делаю не так или как использовать onPostExecute для показа сообщений спасибо

Ответы [ 5 ]

3 голосов
/ 16 марта 2012

Вы не можете обновить TextView в другом потоке (поскольку Asyn выполняет работу в новом потоке), поскольку он принадлежит потоку пользовательского интерфейса.Так что исправьте ваш doInBackground как показано ниже:

protected Void doInBackground(final Void... unused) { 
    String auth=calllogin(Username,Passowrd); 
    cls_constant.userid=auth;
    if(auth.equals("0"))
    {
      YourActivityClass.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            TextView errorTextview=(TextView)findViewById(R.id.tv_error);
                errorTextview.setText("Username & Password incorrect.");
        }
      });
    }
    else {

    Intent intnt=new Intent(getBaseContext(), aftersignin.class);
    startActivity(intnt);
    }
    return null; // don't interact with the ui! 
}
0 голосов
/ 16 марта 2012

onPostExecute здесь, чтобы помочь вам.Так что вы могли бы также использовать его.

Проблема в том, что doInBackgoround не работает в потоке пользовательского интерфейса.Однако onPostExecute есть.Так что он поможет вам.

Измените AsyncTask на что-то вроде этого

class MyTask extends AsyncTask<Void, Void, Boolean> {

  onPreExecute(....)

  protected Boolean doInBackground(final Void... unused) {
     String auth=calllogin(Username,Passowrd); 
     cls_constant.userid=auth;
     if(auth.equals("0")) 
        return false;
     else
        return true;
  }

  protected void onPostExecute(Boolean result) { 
     if (this.dialog.isShowing()) 
        this.dialog.dismiss(); 

     if (!result) { 
        TextView errorTextview=(TextView)MyActivity.this.findViewById(R.id.tv_error);
        errorTextview.setText("Username & Password incorrect.");
     } else {
        Intent intnt=new Intent(getBaseContext(), aftersignin.class);
        MyActivity.this.startActivity(intnt);
  } 
}
0 голосов
/ 16 марта 2012

Еще один способ сделать это, без дополнительного кода runOnUiThread или Handler.Захватите ошибку / успех в doInBackground(), затем в onPostExecute() обновите TextView или запустите действие соответственно.

0 голосов
/ 16 марта 2012

вы ничего не можете коснуться в пользовательском интерфейсе из фонового потока (например, асинхронные задачи). Правильный способ сделать это - использовать обработчик, когда auth.equals ("0") вы должны вызвать этот обработчик и обновить пользовательский интерфейс оттуда...

if(auth.equals("0")){
    Message msg = handler.obtainMessage();
    msg.what = "error";
    msg.obj = "Username & Password incorrect.";
    handler.sendMessage(msg);
}

в теме пользовательского интерфейса:

final Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {
    if(msg.what==error){
      TextView errorTextview=(TextView)findViewById(R.id.tv_error);
      errorTextview.setText(msg.what.toString());
    }
    super.handleMessage(msg);
  }
};
0 голосов
/ 16 марта 2012

К тому времени, как вы доберетесь до if(auth.equals("0")), вы почти закончили с AsyncTask, так что вы можете переместить весь этот блок в onPostExecute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...