如何根据受保护的String doInBackground方法中的AsyncTask结果调用Toast.makeText()?

时间:2013-10-10 13:52:05

标签: java android android-asynctask

我从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中调用它,我该如何调用?

4 个答案:

答案 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消息。
你可以解决这个问题的方法是:

  • 将您的Toast放入AsyncTask的onPostExecute
  • 使用以下命令创建将在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)方法