Тост сообщение не отображается

В следующем коде я не могу сделать всплывающее сообщение внутри метода doInBackground.

Когда я удаляю эту строку, запись строки "error" в текст редактирования выполняется нормально.

Что я делаю неправильно?

private class Verify extends AsyncTask<Void, Void, Void> {    

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
  }   

  @Override
  protected Void doInBackground(Void... params) {
    username = etusername.getText().toString();
    password = etpass.getText().toString();   

    ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
    postParameters.add(new BasicNameValuePair("username", username));
    postParameters.add(new BasicNameValuePair("password", password));   

    String response = null;
    String result;    

    try {
      response = CustumHttpClient.executeHttpPost(url_verify_detials, postParameters);
      result = response.toString();
      result = result.replaceAll("\\s+", "");
      if (!result.equals("0")) {
        Intent in = new Intent(MainActivity.this, danpage.class);
        startActivity(in);
      } else {
        Toast.makeText(getApplicationContext(), "this is my Toast message!!", Toast.LENGTH_LONG)
            .show();
        etusername.setText("Error");
      }
    } catch (Exception e) {
    }
    return null;
  }   

  @Override
  protected void onPostExecute(Void result) {
    super.onPostExecute(result);
  }
}

4 ответа

Решение

Вы не можете поместить любой код, который что-либо делает с пользовательским интерфейсом, внутри метода doInBackground. Если вы хотите показать свой тост, вам нужно будет вернуть результат в onPostExecute и обработать его там.

Как вы возвращаете результат в onPostExecute? В вашем определении класса третий параметр внутри <> - это тип, который вы хотите вернуть в методе onPostExecute, поэтому объявление будет выглядеть так:

 private class Verify extends AsyncTask<Void, Void, String> 

и вы на PostExecute будете выглядеть

protected void onPostExecute(String result) {

Пожалуйста, смотрите ссылку для хорошего примера. http://developer.android.com/reference/android/os/AsyncTask.html

Ты можешь использовать publishProgress а также onProgressUpdate сделать Toast:

private static final int ERROR = -1;
...
try {
  response = CustumHttpClient.executeHttpPost(url_verify_detials, postParameters);
  result = response.toString();
  result = result.replaceAll("\\s+", "");
  if (!result.equals("0")) {
    Intent in = new Intent(MainActivity.this, danpage.class);
    startActivity(in);
  } else {
    //Toast.makeText(getApplicationContext(), "this is my Toast message!!", Toast.LENGTH_LONG)
    //    .show();
    //etusername.setText("Error");
    publishProgress(ERROR);
  }
} catch (Exception e) {
}
...

@Override protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if (values[0]==ERROR){
  Toast.makeText(MainActivity.this, "this is my Toast message!!", Toast.LENGTH_LONG)
      .show();
  etusername.setText("Error");
}

}

Вы должны использовать метод runOnUIThread для выполнения этого кода.

Вы должны выполнять методы пользовательского интерфейса в этом потоке.

Да, тост должен отображаться в потоке пользовательского интерфейса. Если вы не возвращаете результат из doInBackground, вы можете вместо этого вернуть логическое значение и использовать его в onPostExecute, чтобы показать свой тост. onPostExecute выполняется в потоке пользовательского интерфейса. runOnUIThread - это тоже решение...

Другие вопросы по тегам