gpt4 book ai didi

java - 取消 asyncTask 成本昂贵吗?

转载 作者:行者123 更新时间:2023-12-02 05:50:30 28 4
gpt4 key购买 nike

因此,如果我运行 5 个异步任务并取消它们,UI 会卡住一点,但如果我运行 20 个异步任务并取消它们,那么我的 UI 会卡住一段明显的时间。我的问题是, asyncTask.cancel(true) 方法昂贵吗?我的用户界面是这样卡住的吗?我注意到,当我不调用取消时,我的用户界面不会卡住。有什么办法可以防止我的用户界面卡住吗?我尝试将 .cancel(true) 方法放入它自己的线程中,但这没有帮助。

这里有一些代码。

     //could be as little as 1 or could be 20
for( AsyncTask asyncTask : asyncTasks )
{
if ( asyncTask != null )
{
//seems to block UI for a bit if there are a lot of calls
asyncTask.cancel( true );
}
}

最佳答案

您的任务是否检查 isCancelled()在你的 doInBackground() 函数中?

AsyncTask旨在在后台快速运行(即计算时间短的任务)并将结果发布到 UI 线程。这意味着当您调用 asyncTask.cancel(true); 时,而不是 onPostExecute在 UI 线程上调用,onCancelled在 UI 线程上调用。

由于“取消”是在 UI 线程上调用的,如果您的线程处于紧密循环中并且没有对任何全局变量进行任何检查或取消请求(例如检查 isCancelled ),则可能需要“底层 API 清理线程的“一点时间”(在线程不自行结束的情况下正确结束/取消线程),这“一点时间”就是您体验到的 UI“暂停”。

为了缓解这种情况,请在您的 doInBackground 中函数,只需检查 isCancelled 函数即可:

// simple example function:
protected Void doInBackground (Void... params) {
for(int i=0; i < 65535; ++i) {
if (isCancelled()) { break; } // exit loop on cancel request
}
return null;
}

在此 AsyncTask 中,如果我们随后调用 asyncTask.cancel(true);,则循环将在下一次检查 isCancelled 时中断,并且UI 线程可以继续,而不是等待循环完成其迭代(从而“暂停”UI,直到线程完成)。

希望能有所帮助。

关于java - 取消 asyncTask 成本昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23577493/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com