1

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

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

我想到了异步任务,但我担心任务无法生存。(操作可能需要长达 15 分钟)

4

2 回答 2

2

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

于 2013-03-14T15:41:19.600 回答
1

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

所以在你的 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))

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

于 2015-05-25T05:22:55.783 回答