2012-07-18 52 views
0

我想要从调用AsyncTask执行的方法返回一个布尔值,如果为了查找它是否完成而执行。以前我调用了.get()方法(这很好),但是这会暂停所有线程,我想要一个进度对话框。AsynTask确定何时完成

我玩弄了一个for循环的想法,每100ms睡眠/等待,然后检查getStatus()以查看它是否等于Status.FINISHED,但这似乎是一个糟糕的主意。

下面是代码的一小部分。

jData.theTask.execute(url); 


    if(jData.theTask.getStatus() == AsyncTask.Status.FINISHED) { 
     if(!WebService.webServiceValid()) { 
      showMessage(); 
      return false; 
     } 

     return true; 
    } 


    Log.d("fired", "false fired"); 
    return false; 

的操作不会是瞬间完成,所以它只是返回false和竞争状态是由于操作尚未完成的发生。如上所述,我可以将它封装在for循环中以定期检查x次,但我确定有可能有更好的解决方案。

非常感谢

编辑:

似乎调用.execute()则获得()实际上允许UI产卵我的进度对话框,同时等待。获得布尔(长超时,TimeUnit timeUnit)。这是解决我的问题的方法,但是我会让问题一直公开,直到明天再有人对此发表评论。

+0

它是一个非常糟糕的做法是使用AsyncTask.get()。你实际上牺牲了AsyncTask的好处并且使得UI线程被阻塞并等待工作线程,因此不再是异步的。更糟糕的是,应用程序可能会抛出ApplicationNotRespondingException。你应该重构你的代码并在onPostExecute()回调方法中实现你需要的所有东西。 – yorkw 2012-07-19 01:52:33

回答

1

知道AsyncTask是否完成的最适合的地方是方法onPostExecute,该方法在执行doInBackground()之后调用。你可以做的是根据你的后台活动的执行情况从doInBackground()返回一个Boolean变量。当控件达到onPostExecute()时,可以确保您的后台活动已完成。

您使用AsyncTask的方式是不合适的,因为在拨打对象AsyncTask对象后,控制权返回到下一行代码。

+0

感谢您的回复,是的,我使用OnPostExecute()来关闭我的ProgressDialog,我也返回一个布尔值,它只是从实际的Async对象中检查完成。我可以调用.execute()然后.get()作为布尔值,但是调用者线程仍然会被阻塞,所以没有对话框。 – Ash 2012-07-18 13:28:25

0

如果移动(jData.theTask.getStatus()== AsyncTask.Status.FINISHED){}块到内onPostExecute的)中的内容(

相关问题