因此,如果我有5个asynctasks正在运行并取消它们,那么UI会冻结一点,但如果我执行20个asyncTasks并取消它们,那么我的UI会冻结一段时间。我的问题是,asyncTask.cancel(true)方法是否昂贵?这样我的用户界面会冻结吗?我注意到,当我不打电话取消时,我的UI不会冻结。无论如何我可以防止我的UI冻结?我尝试将.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 );
}
}
答案 0 :(得分:1)
您的任务是否检查doInBackground()
功能中的isCancelled()
?
AsyncTask
意味着在后台快速运行(即计算上较短的任务)并将结果发布到UI线程。这意味着当您调用asyncTask.cancel(true);
时,而不是在UI线程上调用 onPostExecute
,在UI线程上调用onCancelled
。
取消'取消'在UI线程上调用,如果您的线程处于紧密循环中且未对任何全局变量进行任何检查或取消请求(如检查isCancelled
),则可能需要一个'时间'对于底层的API来清理你的线程(正确地结束/取消它而不用你的线程结束自己),那个时间点'用户界面暂停'你经历过。
要解决此问题,请在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线程可以继续而不是等待循环完成它&# 39; s迭代(因此&#39;暂停&#39; UI,直到线程完成)。
希望可以提供帮助。
答案 1 :(得分:1)
在进行取消调用后,我正在记录使用jackson库的对象。它重新实例化了
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
每次我想使用这种方法。因此,我只是实例化了新的ObjectMapper()。writer()。withDefaultPrettyPrinter();曾经,它修复了我在用户界面上的延迟。