2

我可能阅读了关于该主题的每个教程和每个论坛讨论,但仍然无法实现!这非常令人沮丧。
似乎这样做的方法是将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();
    }

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

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

4

3 回答 3

1

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

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

因此,对于并行执行,您不能使用 asynctask。以上引用自文档。因此,对于并行执行,我建议您查看 executor。

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

于 2013-05-26T03:55:26.233 回答
0

Just too much text. Please remove, there is a lot that is not needed.

Your design is complex, simplify it.

Why dont you just start 2 Async Tasks. Why have 2 jobs in 1 async task ? In one async task you can do your background thingy, and the other async task in the Pre and Post you can start your animation and stop your animation.

于 2013-05-27T03:49:29.550 回答
0

听起来您正在从AsyncTask. 这不是线程安全的,可能是导致问题的原因。

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

于 2013-05-25T23:13:56.410 回答