中断IntentService

时间:2013-03-14 15:28:17

标签: android multithreading service android-asynctask intentservice

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

现在我在IntentService上阅读了很多东西,实际上我已经将它实现为处理REST调用的通信类,但现在我试图将它用于长时间运行的数据处理。

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

有一些优雅的方法吗?(类似于Thread.interrupt())目前我有一个静态布尔“运行”,我已经覆盖onStartCommand

@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()对我不起作用,因为我需要打断正在做的事情。我试过了,代码就继续执行了。

我想到了asynctask,但我担心这个任务不会存活下来(操作可能需要15分钟)

2 个答案:

答案 0 :(得分:2)

我认为IntentService并不适合您的目的。相反,您可以直接扩展Servicehttp://developer.android.com/guide/components/services.html#ExtendingService)并在特定的启动命令中清除消息队列(在这种情况下为Handler)并执行完成过程。

答案 1 :(得分:1)

我想出的一个简单的解决方案是添加一个后台线程(IntentService为你旋转)代码检查的字段,并在onDestory()中设置,当你执行一个在IntentService类上调用stopService()。

所以在你的IntentService中:

@Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(LOGTAG, "got on destroy, asking background thread to stop as well");
        mPleaseStop = true;
    }

@Override
protected void onHandleIntent(Intent intent) {
    while(true) {
        Log.d(LOGTAG, "Doing some long running stuff here");
        if (mPleaseStop) {
            return;
        }
    }
} 

然后只需致电

stopService(new Intent(this, MyIntentService.class))

而且要正确,你应该进行设置并检查同步。