Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask阻止回键分派事件_Android - Fatal编程技术网

Android AsyncTask阻止回键分派事件

Android AsyncTask阻止回键分派事件,android,Android,问题是: 我的活动在onStart()中启动异步任务。 在doInBackground方法中,我提出一个简短的webrequest,根据您的网络连接,这可能需要一点时间,因此我希望此任务可以取消 但是 经过数小时的搜索、测试和调试,我注意到,当用户在doInBackground方法中按下back按钮时,Keyevent总是在我的doInBackground方法完成后发送 因此,我不必奇怪,当用户按下backbutton时,为什么asynctask从未被取消, 调用AsyncTask.cancel

问题是:

我的活动在onStart()中启动异步任务。 在doInBackground方法中,我提出一个简短的webrequest,根据您的网络连接,这可能需要一点时间,因此我希望此任务可以取消

但是

经过数小时的搜索、测试和调试,我注意到,当用户在doInBackground方法中按下back按钮时,Keyevent总是在我的doInBackground方法完成后发送

因此,我不必奇怪,当用户按下backbutton时,为什么asynctask从未被取消, 调用AsyncTask.cancel(true)太晚。。。。。(即使我不确定取消(true)是否有帮助)

这是asynctask和backbutton的正常行为吗

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

等待超时


我请求帮助,取消异步webrequest应该是可能的:)

这是预期的行为。文件说:

取消任务

任何时候都可以通过以下方式取消任务: 调用取消(布尔)。援引 此方法将导致后续错误 调用isCancelled()以返回true。 调用此方法后, onCancelled(对象),而不是 将调用onPostExecute(对象) 在doInBackground之后(对象[]) 返回。确保一项任务 请尽快取消 应该始终检查返回值 从 doInBackground(对象[]),如果可能 (例如,在循环内部。)

当用户在doInBackground方法期间按下back按钮时,Keyevent总是在my doInBackground方法完成后被调度

不,这不是真的

如果在我的主活动(从服务器下载文件)中运行异步任务时,我在设备上按下后退按钮,该活动将立即关闭

然而,真正的情况是,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”)正在阻止
,而
循环则
isCancelled
在完成之前不会被检查。

可能会显示调用AsyncTask.cancel.wouldnt的代码,因为代码执行得太晚了。问题是直到doInBackground方法完成后,才会调度back按钮的KEYEVENT。我调试了它,我可以在日志中看到它,而doInBackground正在运行日志说:“等待调度关键事件”这不正常,我绝望了。它与在活动的onStart()方法中启动Asynctask有关。但是我必须在某个地方启动AsyncTask…@VinoRosso:“等待分派密钥事件”…日志条目是在哪里创建的?(在你的代码中)你在哪里等待“捕获”后退按钮事件?当我按下后退按钮并且doInBackground正在运行时,这个日志条目来自android操作系统。在我的代码中,我捕获onKeyDown中的Back按钮事件。但是这个事件来得太晚了。@VinoRosso:但是你的onKeyDown监听器在哪里?您没有发布任何代码,因此很难帮助解决此问题。代码:
@Override public boolean onKeyDown(int keyCode,KeyEvent event){if(keyCode==KeyEvent.keyCode_BACK){loader.cancel(true);super.onBackPressed();}return super.onKeyDown(keyCode,event)}