问题是:
My Activity在onStart()中启动AsyncTask。 在doInBackground方法中我做了一个简短的webrequest,根据你的网络连接,这可能需要一点点,所以我希望这个任务可以取消...
但..
经过几个小时的搜索,测试和调试后,我注意到,当用户在doInBackground方法中按下后退按钮时,Keyevent总是在我的doInBackground方法完成后调度。
所以我不必想知道为什么当用户按下后退按钮时asynctask永远不会被取消, AsyncTask.cancel(true)调用太晚了.....(即使我不确定取消(true)是否有帮助)
这是正常的行为与asynctask和backbutton?
这是不正常的,因为用户应该如何从缓慢连接的活动中恢复?
等待超时?
我正在寻求帮助,取消异步网络请求应该是可能的:)
答案 0 :(得分:1)
当用户在doInBackground方法中按下后退按钮时,总是在我的doInBackground方法完成后调度Keyevent。
不,这不是真的。
当我的主Activity中运行AsyncTask(从我的服务器下载文件)时,如果我点击设备上的BACK按钮,活动会立即关闭。
但是,AsyncTask将继续运行其doInBackground()
方法中的任何代码,除非我明确取消它(但你已经知道了)。
据我所知,您的'webrequest'(无论可能是什么)阻止了您的doInBackground()
方法,因此,任何尝试在onPause()
onStop
中取消它},onDestroy()
等永远不会奏效。
正如advantej指出的那样,AsyncTask.cancel(...)
方法的工作方式是将isCancelled
设置为'true'。为了成功取消AsyncTask的doInBackground()
方法,您需要定期检查isCancelled
。实施例...
@Override
protected Void doInBackground(String... params) {
while (!isCancelled) {
DoSomething();
}
}
问题是如果DoSomething()
(例如您的'webrequest')阻止了while
循环,则isCancelled
在完成之前不会被检查。
答案 1 :(得分:0)
这是预期的行为。文档说:
取消任务
任务可以随时取消 调用cancel(boolean)。调用 这种方法会引起后续的 调用isCancelled()返回true。 调用此方法后, onCancelled(Object),而不是 将调用onPostExecute(Object) 在doInBackground之后(Object []) 回报。确保完成任务 你尽快取消了 应该经常检查返回值 ofCancelled()定期来自 doInBackground(Object []),如果可能的话 (例如在循环内部。)