我需要计算一个BigDecimal pow(和root),但是对于非常大的数字,这个操作需要10秒或更长时间。因此我创建了以下AsyncTask:
class CalculateTask extends AsyncTask<String, Void, String> {
//...
@Override
protected void onPreExecute() {
super.onPreExecute();
tvStatus.setText("Started calculation...");
}
@Override
protected String doInBackground(String... params) {
val2 = val1.pow(largeValue); //Long operation
}
@Override
protected void onPostExecute(String result) {
//...
}
}
然后我从一个Activity中调用这个AsyncTask:
CalculateTask calculateTask;
void calculate() {
calculateTask = new CalculateTask();
calculateTask.execute(largeValue);
}
但有时需要从Activity中断计算。请问建议,如何中断AsyncTask?
我在与isCancelled()相关的StackOverflow上播放了一些例子,但我不知道如何在这里应用它。
答案 0 :(得分:1)
如果长操作实际上只是一次调用,则无法在循环中应用检查isCancelled()
的标准解决方案。
简单的解决方案是让它运行,但要确保AsyncTask
没有保留对上下文的任何硬引用。或者只是不要担心泄漏上下文几秒钟,并确保在尝试触摸其UI之前活动仍在运行。
复杂的解决方案是实现自己的BigDecimal#pow(...)
替换,在其最内层循环中检查isCancelled()
。
答案 1 :(得分:0)
来自SDK文档:
可以通过调用cancel(boolean)随时取消任务。 调用此方法将导致后续调用isCancelled() 返回true。
如果是,则添加到检查doInBackground()
方法的isCancelled()
方法条件。
@Override
protected String doInBackground(String... params)
{
while (!isCancelled())
{
// do some stuff
val2 = val1.pow(largeValue); //Long operation
}
}
编辑:此代码仅在该循环中有多个功率计算然后您在它们之间取消任务时才有效。