我看过其他几篇关于取消 AsynTask 的帖子,但我认为它们中的任何一个都不能解决问题。想象一下这个场景:
public class TestTask extends AsyncTask<Void, Void, Object> {
@Override
protected void onCancelled(Object result) {
running = false;
Log.i("Test", "onCancelled");
}
@Override
protected Object doInBackground(Void... params) {
try {
Log.i("Test", "cancelling");
cancel(true);
Thread.sleep(5000);
Log.i("Test", "Past sleep");
} catch (InterruptedException e) {
Log.i("Test", "InterruptedException", e);
}
return null;
}
}
想象一下,我想在下载过程中取消这个长达 20 秒的请求,例如,如果服务器对 json 请求的响应速度很慢。所以 Thread.sleep(5000) 可能是我想取消的 HttpGet 请求。但是,取消方法被标记为最终方法,因此我无法覆盖它并调用 get.abort()。onCancel 钩子发生在 doInBackground 之后并返回 UI 线程。一旦 HttpGet 请求开始,检查 isCancel 对我没有任何好处。
我解决这个问题的方法是在我的 AsynTask 上创建一个 abort() 方法,然后调用它。
public void abort() {
get.abort();
cancel(true);
}
但这似乎有点违背Android的原则。有没有更好的方法来取消请求?