Android AsyncTask阻止密钥发送事件

时间:2011-05-16 20:57:44

标签: android

问题是:

My Activity在onStart()中启动AsyncTask。 在doInBackground方法中我做了一个简短的webrequest,根据你的网络连接,这可能需要一点点,所以我希望这个任务可以取消...

但..

经过几个小时的搜索,测试和调试后,我注意到,当用户在doInBackground方法中按下后退按钮时,Keyevent总是在我的doInBackground方法完成后调度。

所以我不必想知道为什么当用户按下后退按钮时asynctask永远不会被取消, AsyncTask.cancel(true)调用太晚了.....(即使我不确定取消(true)是否有帮助)

这是正常的行为与asynctask和backbutton?

这是不正常的,因为用户应该如何从缓慢连接的活动中恢复?

等待超时?

我正在寻求帮助,取消异步网络请求应该是可能的:)

2 个答案:

答案 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 []),如果可能的话   (例如在循环内部。)