2013-10-10 12 views
0

我从AsyncTask中的数据库中提取数据,如果它为null,我想Toast一个警告文本。我在AsyncTask中尝试过,但我知道它不在工作线程中调用。这里是我的doInBackground方法:如何根据AsyncTask的结果在受保护的字符串doInBackground方法中调用Toast.makeText()?

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中调用,我应该怎么调用?

+1

你可以发布错误吗? –

回答

8

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

好解释!我还建议将'Intent'代码移动到'onPostExecute()',这也仅仅是因为你需要根据你的'result'开始一个'Activity'或者显示'Toast'。按照本答案中的建议在'onPostExecute()'中检查它,并采取适当的措施。另外,当你还有代码运行时,我不确定你想要在'doInBackground()'中取消一个任务,如果你把这个代码移动到'onPostExecute()',这将是不必要的。 – codeMagic

+1

@codeMagic你是对的。 – Raghunandan

+0

谢谢你在onPostExecute工程。我以复杂的方式认为这样做不必要:) – elfoz

2

Toast消息必须在主/ UI线程中调用。
就可以解决这个问题的方法是:

  • 把onPostExecute里面你敬酒你的AsyncTask
  • 的使用创建正常吐司的包装,将在UI线程上运行:

例如:

activity.runOnUiThread(new Runnable() { 

@Override 
public void run() { 
    Toast.make... 
} 
}); 
2

,如果你想做到这一点使用handler 所以代码将是

声明Handler handler = new Handler();作为活动类 和使用构件varible以下用于显示TOST

handler.post(new Runnable(){ 
    public void run(){ 
Toast.makeText(getApplicationContext(), "You entered wrong values.",Toast.LENGTH_LONG).show(); 
     } 
}); 
+0

谢谢你也有用。 – elfoz

2

可以传递主线程到的AsyncTask的处理程序,然后利用所述处理程序来安排发布吐司消息的任务。下面是处理程序类的Java文档:

http://developer.android.com/reference/android/os/Handler.html

基本上你应该建立在主/ UI线程对象(以及它会自动绑定到主/ UI线程的活套)。然后你将它传递给你的AsyncTask。那么当你需要显示你使用Handler.post(Runnable)方法的消息时

相关问题