在下一个代码中,我无法在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);
}
}
答案 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)
您可以使用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");
}
}
答案 2 :(得分:-1)
您必须使用runOnUIThread方法来执行此代码。
您必须在该线程中执行ui方法。
答案 3 :(得分:-1)
Yeap ... Toast必须显示在UI线程上。当您不从doInBackground返回结果时,您可以返回一个布尔值,并在onPostExecute中使用它来显示您的Toast。 onPostExecute在UI线程上执行。 runOnUIThread也是一个解决方案......