同时并行执行两个异步任务(我真的需要这个吗?)

时间:2013-05-25 21:56:45

标签: java android

我可能会阅读有关该主题的每个教程和每个论坛讨论,但仍然无法实现!这非常令人沮丧 似乎这样做的方法是使用executeOnExecutor()方法 - AsyncTask.THREAD_POOL_EXECUTOR,所以我在我的代码中做了。但是,第二项任务只是在第一项任务完成后才执行,而不是在同一时间执行 我的min 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();
    }

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

编辑:啊..只是想包括我不在主UI线程上做动画是因为我使用sleep()进行动画,所以无法冻结主线程。

3 个答案:

答案 0 :(得分:1)

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

如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR 调用executeOnExecutor(java.util.concurrent.Executor,Object [])。

因此,对于并行执行,您不能使用asynctask。以上引用文献。所以对于并行执行,我建议你看看执行者。

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

答案 1 :(得分:0)

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

将计算任务保存在一个单独的线程上,并将动画移回UI线程,并且(除非我遗漏了某些东西)应该可以解决这个问题。请记住,绘制到屏幕上的任何内容都必须在主UI线程上发布。

答案 2 :(得分:0)

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

您的设计很复杂,简化了它。

为什么不启动2个异步任务。为什么在1个异步任务中有2个作业?在一个异步任务中,您可以执行后台操作,而在Pre和Post中的另一个异步任务可以启动动画并停止动画。