首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消服务/IntentService/AsyncTask/Looper

如何取消服务/IntentService/AsyncTask/Looper
EN

Stack Overflow用户
提问于 2011-09-08 22:58:14
回答 2查看 4.5K关注 0票数 1

我要疯了。我想要一件简单的事情--我有一个很长的任务(从网上获取几个数据对象),我想要取消它的能力。我尝试了很多东西,但都没有用。

流程是这样的:

用户点击一个按钮

  1. 开始工作(我尝试了AsyncTaskServiceIntentService

任务,包括为进度更新添加正在进行的通知)通知的意图是调用一个新的活动,她唯一的目的是取消正在进行的任务H 212H 113在cancelActivity中我试图为服务/IntentService调用stopService(),或者为Looper调用Looper.quit() (我不记得我尝试了为AsyncTask做什么,也不确定是否有这样的api用于取消)<>代码H 216G 217/code>

在我看来,最好的选择是使用IntentService (我可以有几个任务排队,IntetService会按照我想要的顺序来做),但是我对任何类型的实现都有建议--我不在乎代码是什么,只是我可以选择取消任务

预先感谢您的帮助

德罗尔

(我要上床睡觉了

EN

回答 2

Stack Overflow用户

发布于 2011-09-08 23:39:32

如果不识别背景逻辑中的停止条件,那么使用什么特定操作来停止任务并不重要。要想做到这一点,唯一的方法就是背景工作人员真诚地停下来并退出。

很少有可能的方案和解决方案可以用于取消后台工作。

  • 后台线程执行许多短步骤(例如,使用一些循环进行计算)。在这种情况下,检查操作之间的某些标志(可能是isInterrupted()),如果此标志指示操作必须是isInterrupted()线程等待监视器,则退出。在后台线程上调用interrupt(),在异常处理程序中捕获异常,采取适当步骤干净地完成此任务,并且exit.
  • Background线程正在等待IO。这个用例在一般情况下很难解决。如果使用某种套接字,则可以尝试在外部关闭此套接字并捕获异常。在最坏的情况下,您可以放弃线程的状态,即如果线程从IO返回,它知道它被取消了,并且IO结果必须被丢弃。如果你经常这样做的话--你的内存就会耗尽,所以我不会真的推荐它。

在任何情况下,如果任务不知道被停止的可能性,就没有办法(除了杀死非常糟糕的线程)停止您的任务。

票数 1
EN

Stack Overflow用户

发布于 2011-09-09 11:26:51

好吧,我忙着做一些我想做的事。

我使用的是IntentService,它将使我的任务排队。每个新任务都是AsyncTask。AsyncTask从用pendingIntent为cancelActivity发送通知开始。

单击通知时,用户会收到关于停止任务的警告弹出。如果他比我点击“是”的话,stopService()就会出现在我的IntentService上。

在IntentService中,我添加了:

代码语言:javascript
复制
    @Override
public void onDestroy() {
    currentTask.cancel(true);
    if (mNotificationHelper != null)
        mNotificationHelper.completed();
    super.onDestroy();
    stopSelf();
}

在AsyncTask中,我添加了:

代码语言:javascript
复制
    @Override
protected void onCancelled() {
    isCanclled = true;
    httpClient.getConnectionManager().shutdown();
    mNotificationHelper.completed();
    if (mAsyncTaskListener != null)
        mAsyncTaskListener.AsyncTaskCanceled();
}

因此,这将放弃目前正在运行的所有连接。在执行此工作的实际代码中,我需要捕获连接关闭的异常并处理它。

因此,最后,我实际上并没有停止AsyncTask/Service,而是公开了httpClient,这样我就可以异步地删除连接了。

我觉得有点丑,但我没有别的办法

谢谢大家

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7355499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档