我可能会阅读有关该主题的每个教程和每个论坛讨论,但仍然无法实现!这非常令人沮丧 似乎这样做的方法是使用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。我做错了什么?
我希望两个任务平行运行的原因是:第一个任务是计算任务,另一个是计算机正在思考的自定义沙漏图像旋转动画(它是一个游戏应用程序)。
答案 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中的另一个异步任务可以启动动画并停止动画。