2011-10-01 53 views
1

我正在创建一个游戏,当用户与GUI进行交互时,计算机在后台任务中发现拼图的解决方案。用户可以随时选择结束游戏,此时我想停止后台任务并检索找到的解决方案。在请求时完成一个AsyncTask

这一切都工作正常,但我不能强制后台任务结束时,用户选择?!?当用户选择“完成”我有以下几点:

computerSolutionTask.cancel(true); 

// ...disable some GUI buttons etc... 

while (computerSolutionTask.getStatus() != AsyncTask.Status.FINISHED){ 
    // ...do nothing... 
} 
txt_computer.setText(computerSolutionTask.get()); 

在我的AsyncTask类我检查“isCancelled()”定期,但它似乎只是在while循环我上面包括挂起。

我觉得我可能会对这件事有点不正确,因为我不想取消后台任务,我只是想让它完成,并返回它所拥有的任何内容。

This线程似乎问我同样的问题,但没有解决办法...我画坯用我所有的研究迄今任何帮助,将不胜感激。

+0

不知道Android的,但是,只有一个CPU在一个典型的系统/ OS,这样的代码肯定会永远挂在这个循环中,如果后台任务必须比前景更低的优先级 - 后台任务会根本没有CPU,所以永远不会检查它的取消标志。最好等待后台任务停止时发出的信号。然后后台线程可以等待它自己的事件,直到处理完当前结果为止,然后可以发信号通知该事件以使后台继续。作为一个测试 - 在循环中加入一个短暂的sleep()。 –

+0

好吧,我按照你的建议在while循环中加入了一个睡眠,但它仍然只是坐在那里,从来没有发现“完成”状态?我相信这个问题很可能与“K-ballo”在下面提到的有关。 – MisterWeary

回答

1

正在运行的AsyncTask被取消将永远不会达到onPostExecute,因此它永远不会“完成”。无论如何,如果您的特定逻辑要求使用常规同步方法,则无需等待。

+0

杰出!非常感谢。我意识到现在“取消”任务就是阻止它给我任何东西......所以我在我的任务中写了一个名为“finishMyTask();”的公开方法,它简单地停止了我的递归gamesolver。问题解决了 – MisterWeary

0

您需要将条件放在doInBackground()方法内,以检查AsyncTask是否被取消或处于运行状态。

protected Object doInBackground(Object... x) 
    { 
     while (/* condition */) 
     { 

     // work... 

     if (isCancelled()) break; 

     } return null; } 
+1

我确实有这个,虽然它从我的递归“gameSolver”代码中解脱出来,但它没有完成,这意味着我无法得到结果。 “K-ballo的”方向让我走上了正轨。感谢您的帮助! – MisterWeary