【问题标题】:asynctask WAIT mode异步任务等待模式
【发布时间】:2014-10-09 07:28:13
【问题描述】:
当我在 UI 上按下 button1(执行)时,我运行 AsyncTask。任务运行成功。
我按下另一个按钮2(取消)以从主线程停止异步任务
asynctask.cancel(true);
但是 AsyncTask 线程不会自我杀死! (见第二个截图)
asynctask 切换到 WAIT 模式
然后我可以再次按下按钮 1(执行)并运行新任务并按下按钮 2(取消)
我有疑问:
为什么在使用 cancel(true) 后任务不执行 selfkill?
为什么是等待模式?
【问题讨论】:
标签:
android-asynctask
wait
kill
【解决方案1】:
AsyncTask 在底层使用 ThreadPoolExecutor。这些线程可能暂时不会消失,因为过于频繁地创建和拆除这些线程是一种浪费。一段时间后,如果您创建更多 AsyncTasks,您会发现它会停止创建新线程并重新使用旧线程。
更新以解决一些细节:
您会认为如果池中有空闲线程,它就不会创建新线程,但事实并非如此。这个想法是有一定数量的线程可以用来继续处理异步任务。这称为核心池大小。在 Android 的 AsyncTask 案例中,他们似乎已将其设置为 5。如果您查看 ThreadPoolExecutor 的文档,它会说:
When a new task is submitted in method execute(Runnable), and fewer than corePoolSize threads are running, a new thread is created to handle the request, even if other worker threads are idle.
还有一个最大值恰当地称为最大池大小。