Тост сообщение не отображается
В следующем коде я не могу сделать всплывающее сообщение внутри метода 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 - это тоже решение...