首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >中断IntentService

中断IntentService
EN

Stack Overflow用户
提问于 2013-03-14 23:28:17
回答 2查看 1.7K关注 0票数 1

我正在创建一个应用程序,其中我需要处理的数据可能是巨大的,可能需要一些时间。

现在我读了很多关于IntentService的东西,实际上我已经将它实现为一个处理REST调用的通信类,但现在我正在尝试将它用于长期运行的数据处理。

我在标题栏中添加了一个进度指示器,但现在我希望能够在用户单击它时取消该操作。

有没有什么很好的方法可以做到这一点呢?(比如Thread.interrupt())目前我有一个静态的布尔值"running“,并且我已经重写了onStartCommand,以

代码语言:javascript
复制
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getAction() != null && intent.getAction().equals("stop")) {
        running = false;
    }
    onStart(intent, startId);
    return START_NOT_STICKY;
}

我发现这样做既麻烦又不优雅,并且觉得我可能把IntentService误用到了它不想做的事情上。有没有更优雅的方式来做这件事?

stopSelf()对我不起作用,因为我需要中断正在做的事情。我试过了,代码继续执行。

我想到了异步任务,但我担心这个任务不会继续下去。(操作可能需要15分钟)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-14 23:41:20

我认为IntentService并不真正适合您的目的。相反,您可以根据特定启动命令直接扩展Service (http://developer.android.com/guide/components/services.html#ExtendingService)并清除消息队列(在本例中为Handler),并执行您的终止过程。

票数 2
EN

Stack Overflow用户

发布于 2015-05-25 13:22:56

对于这种情况,我想出了一个简单的解决方案,就是添加一个字段,后台线程( IntentService为您旋转该字段)检查该字段,该字段在onDestory()中设置,当您对IntentService类执行stopService()调用时,将调用该字段。

所以在你的IntentService中:

代码语言:javascript
复制
@Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(LOGTAG, "got on destroy, asking background thread to stop as well");
        mPleaseStop = true;
    }

代码语言:javascript
复制
@Override
protected void onHandleIntent(Intent intent) {
    while(true) {
        Log.d(LOGTAG, "Doing some long running stuff here");
        if (mPleaseStop) {
            return;
        }
    }
} 

然后给我打电话

代码语言:javascript
复制
stopService(new Intent(this, MyIntentService.class))

为了正确,你也应该使设置和检查同步。

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

https://stackoverflow.com/questions/15413430

复制
相关文章

相似问题

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