我从AsyncTask中的数据库中获取数据,如果它为null,我想要Toast一个警告文本。我在AsyncTask中尝试但是我知道它不是在工作线程中调用的。这是我的doInBackground方法:
protected String doInBackground(Boolean... params) {
String result = null;
StringBuilder sb = new StringBuilder();
try {
HttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet( "http://191.162.2.235/getProducts.php?login=1&user_name="+UserName+"&user_pass="+Password);
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() != 200) {
Log.d("MyApp", "Server encountered an error");
}
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF8"));
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
result = sb.toString();
if ( result == null ) {
// Toast.makeText(getApplicationContext(), "You entered wrong values.", Toast.LENGTH_LONG).show();
asyncTask.cancel(true);
Intent inte=new Intent(MainActivity.this, MainActivity.class);
inte.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
inte.addCategory(Intent.CATEGORY_HOME);
startActivity(inte);
}
}
catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
return result;
}
我取消了该任务并在我的代码中创建了一个新意图。你不在乎他们。你看到Toast.makeText ..行,我试过这样一个当然它给出了错误。我怎样才能做到这一点?如果没有在AsyncTask中调用它,我该如何调用?
答案 0 :(得分:10)
doInbackground
。所以你不能在ui线程以外的其他线程上更新ui。
您可以在doInbackground
中根据onPostExecute
中的结果更新ui或使用runOnUithread
作为活动类的方法返回结果。
runOnUiThread(new Runnable() {
@Override
public void run() {
// toast here
}
});
或者
protected String doInBackground(Boolean... params) {
// other code
return "status"
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Toast.makeText(getApplicationContext(),"My status is"+result,Toast.LENGTH_SHORT).show();
}
修改
根据@codeMagic的建议,将startActivity转移到onPostExecute
。当你还有代码要运行时,你也不想取消asynctask运行
答案 1 :(得分:2)
必须在主/ UI线程中调用Toast消息。
你可以解决这个问题的方法是:
示例:
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.make...
}
});
答案 2 :(得分:2)
如果你想这样做,请使用handler
所以代码将是
将Handler handler = new Handler();
声明为活动类中的成员变量
并使用以下显示tost
handler.post( new Runnable(){
public void run(){
Toast.makeText(getApplicationContext(), "You entered wrong values.",Toast.LENGTH_LONG).show();
}
});
答案 3 :(得分:2)
您可以将主线程的Handler传递给AsyncTask,然后使用Handler来安排发布Toast消息的任务。以下是Handler类的java文档:
http://developer.android.com/reference/android/os/Handler.html
基本上你应该在main / UI线程中创建该对象(它将自动绑定到main / UI线程的Looper)。然后你将它传递给你的AsyncTask。然后,当您需要显示消息时,使用Handler.post(Runnable)方法