Toast消息不显示

时间:2014-12-14 15:40:22

标签: android android-asynctask toast android-toast

在下一个代码中,我无法在doInBackground方法中跳转toast消息。

当我删除这一行时,将“错误”字符串写入edittext就可以了。

我做错了什么?

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 个答案:

答案 0 :(得分:0)

您不能在doInBackground方法中放置任何对用户界面做任何事情的代码。如果你想要展示吐司,你需要将结果返回给onPostExecute并在那里处理。

如何将结果返回给onPostExecute?在您的类定义中&lt;&gt;内的第三个参数是您希望在onPostExecute方法中返回的类型,因此您的声明将类似于

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

你onPostExecute看起来像

protected void onPostExecute(String result) {

请参阅参考资料以获得一个好例子。 http://developer.android.com/reference/android/os/AsyncTask.html

答案 1 :(得分:0)

您可以使用publishProgressonProgressUpdate制作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");
}

}

答案 2 :(得分:-1)

您必须使用runOnUIThread方法来执行此代码。

您必须在该线程中执行ui方法。

答案 3 :(得分:-1)

Yeap ... Toast必须显示在UI线程上。当您不从doInBackground返回结果时,您可以返回一个布尔值,并在onPostExecute中使用它来显示您的Toast。 onPostExecute在UI线程上执行。 runOnUIThread也是一个解决方案......