【发布时间】:2012-02-18 04:25:48
【问题描述】:
我遇到了这个问题:
我有一个主 Activity 请求另一个类的信息,该类从 Web 服务获取该信息,所以我在 AsyncTask 类上执行此操作。在加载数据时,主 Activity 显示一个 ProgressDialog,我正在处理后退按钮,因此当按下它时我可以关闭对话框,但现在我想取消 AsyncTask。我创建了一个静态布尔变量,当按下后退按钮时它是“真”,所以从 AsyncTask 的 doInBackground 方法我检查该变量是否为真,如果它是true 我取消了 AsyncTask:
@Override protected Void doInBackground(Integer... args) {
try {
....
if ( MainActivity.isDialogCancelled ){
cancel(true);
}
....
} catch (Exception e) {
....
}
}
这似乎工作正常,但是当我以这种方式取消任务时,我看到 InterruptedException 警告,为什么会发生这种情况以及如何避免它们?我做错了什么?
这些是警告:
01-24 18:40:50.582: W/AsyncTask(22877): java.lang.InterruptedException
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1272)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:220)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask.get(FutureTask.java:83)
01-24 18:40:50.582: W/AsyncTask(22877): at android.os.AsyncTask$3.done(AsyncTask.java:196)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask$Sync.innerCancel(FutureTask.java:294)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask.cancel(FutureTask.java:76)
01-24 18:40:50.582: W/AsyncTask(22877): at android.os.AsyncTask.cancel(AsyncTask.java:325)
01-24 18:40:50.582: W/AsyncTask(22877): at android.os.AsyncTask$2.call(AsyncTask.java:185)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
01-24 18:40:50.582: W/AsyncTask(22877): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
01-24 18:40:50.582: W/AsyncTask(22877): at java.lang.Thread.run(Thread.java:1019)
提前致谢
【问题讨论】:
-
你确定你是在正确的地方做的吗?你读过这个吗?取消任务- 可以通过调用 cancel(boolean) 随时取消任务。调用此方法将导致对 isCancelled() 的后续调用返回 true。调用此方法后,将在 doInBackground(Object[]) 返回后调用 onCancelled(Object),而不是 onPostExecute(Object)。为了确保尽快取消任务,如果可能(例如在循环内),您应该始终从 doInBackground(Object[]) 定期检查 isCancelled() 的返回值。
-
对不起,我没有把整个代码,但我已经抓住了它,但它仍然在 Logcat 上显示警告,我更新了主帖子上显示 try/catch 的代码使用
-
请不要对代码或堆栈跟踪使用引号样式,而是使用代码按钮(或行首的 4 个空格)。谢谢
-
@Sergey,我看了你贴的那段话,上面说我不能随时取消任务...我可以从类本身的方法 doInBackground 中取消任务吗?
标签: android