- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,如果我运行 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/
我正在阅读 MongoDB,并试图了解它的最佳用途。我没有看到明确答案的一个问题是哪些操作便宜或昂贵,以及在什么条件下。 你能帮忙澄清一下吗? 谢谢。 最佳答案 人们经常声称 mongodb 的写入速
我正在寻找一个主要来源(或一个非常好的解释)来支持在为 iPhone 编写软件时使用 autorelease 是危险的或过于昂贵的说法。 许多开发者都提出了这种说法,我什至听说 Apple 不推荐它,
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并
我是一名优秀的程序员,十分优秀!