0

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

我正在玩弄一个 for 循环的想法,该循环每 100 毫秒说一次睡眠/等待,然后检查 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() 然后 .get() 实际上允许 UI 在等待来自 .get(long timeout, TimeUnit timeUnit) 的布尔值时生成我的进度对话框。这是我的问题的解决方案,但是我将把这个问题留到明天,以防有人对此发表评论。

4

2 回答 2

1

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

您使用的方式AsyncTask是不合适的,因为在execute()AsyncTask对象的调用之后,控件返回到下一行代码。

于 2012-07-18T13:05:00.680 回答
0

将 if(jData.theTask.getStatus()==AsyncTask.Status.FINISHED) {} 块的内容移动到 onPostExecute() 内部

于 2012-07-18T13:32:32.977 回答