2013-05-25 43 views
2

我读过关于该主题的每个教程和每个论坛讨论,但仍然无法实现!这是非常令人沮丧的。
看来,这样做的方式是使用executeOnExecutor()方法与 - AsyncTask.THREAD_POOL_EXECUTOR,所以我在我的代码。但第二项任务只是在第一项任务完成后才执行,而不是在同一时间执行。
我最小SDK版本为2.3,最大为4.2,所以我做了检查:同时并行处理两个异步任务(我真的需要这个吗?)

if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.HONEYCOMB) { 
    engine.setEnginesTurn(true); 
    engineThread = new EngineThread(board,engine,activity,boardView); 
    rt = new RotateTask(boardView); 
    engineThread.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
    rt.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

} 
else{ 
    engine.setEnginesTurn(true); 
    engineThread = new EngineThread(board,engine,activity,boardView); 
    rt = new RotateTask(boardView); 
    engineThread.execute(); 
    rt.execute(); 
    } 

忽略布尔变量here..it是不相关的,也因为你想知道为什么我没有其他的代码不要发布。这是一团糟,但都工作得很好,执行两项任务。我究竟做错了什么?
我希望两个任务并行运行的原因是:第一个任务是一个计算任务,另一个是在计算机思考(其游戏应用程序)时旋转动画的自定义沙漏图像。

编辑:啊..只是想包括我不做主要UI线程上的动画是因为我使用睡眠()的动画,所以不能冻结主线程。

+0

太多的文字... -_- –

+0

对此感到抱歉,但事实上,我在这里有两个问题,我还想解释需要两个独立任务的原因。这太可怕了吗? (我的意思是文本的长度):) – user2030118

+0

这不仅仅是它很长,但不是很清楚。如果你想让人们帮助你,你应该努力清楚地表达你的问题。 – toto2

回答

0

听起来好像你正在从AsyncTask的后台线程修改UI。这不是线程安全的,可能导致问题。

保持你的计算任务在一个单独的线程和移动你的动画回到UI线程和(除非我失去了一些东西)应该做的伎俩。请记住,任何绘制到屏幕上的内容都必须在主UI线程上发布。

+0

在动画任务(线程)中,在do(background)()中,我正在更改某个变量并仅从该任务的onProgressUpdate()更新UI,该任务正在主线程上发生。这不是Async Tasks的目的吗?就像我在我的文章中写道的那样,如果我使用sleep(),我如何直接在UI线程上做动画?如果我尝试在主线程中冻结我的应用程序 – user2030118

1

第一次引入时,AsyncTasks在单个后台线程上被串行执行。从DONUT开始,将其更改为允许多个任务并行操作的线程池。 从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

如果你真的想并行执行,你可以用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,对象[])。

所以对于并行执行,你不能使用asynctask。以上是从doc引用的。所以为了平行执行,我建议你看看执行者。

http://developer.android.com/reference/java/util/concurrent/Executor.html

+0

那么OP的问题的答案是什么?从帖子中的代码看来,他似乎理解执行者的概念......那么答案是什么? (还有,为什么#4大胆?) –

+0

此外,也许你不应该[**复制并粘贴**](http://stackoverflow.com/a/16752741/844882)代码从您的其他答案.. 。因为你在代码中提到的HTTP请求在这种情况下没有多大意义。 :) –

+0

他提到他需要并行执行,这对于asynctask来说是不可能的。所以我突出显示了部分文档建议相同。如果他想使用asynctask,他需要遵循线程规则。因此我发布了相同的内容。 – Raghunandan

0

只是太多的文字。请删除,有很多是不需要的。

你的设计很复杂,简化它。

为什么不开始2个异步任务。为什么在1个异步任务中有2个工作?在一个异步任务中,你可以完成你的背景任务,以及Pre和Post中的另一个异步任务,你可以开始你的动画并停止你的动画。

相关问题