我想要从调用AsyncTask的方法中返回一个布尔值,如果要查找它是否已完成。之前我调用了.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)的布尔值时生成我的进度对话框。这是我的问题的解决方案,但是我将问题保持开放直到明天,任何人都对此有任何意见。
答案 0 :(得分:1)
知道AsyncTask是否完成的最合适的地方是在onPostExecute
执行后调用的方法doInBackground()
。您可以做的是根据您的后台活动的执行情况从Boolean
返回doInBackground()
变量。当控件达到onPostExecute()
时,您可以放心,您的后台活动已经完成。
您使用AsyncTask
的方式不合适,因为在execute()
对象上调用AsyncTask
后,控件将返回到下一行代码。
答案 1 :(得分:0)
将if(jData.theTask.getStatus()== AsyncTask.Status.FINISHED){}块的内容移到onPostExecute()
里面