我正在创建一个应用程序,其中我需要处理的数据可能是巨大的,可能需要一些时间。
现在我读了很多关于IntentService的东西,实际上我已经将它实现为一个处理REST调用的通信类,但现在我正在尝试将它用于长期运行的数据处理。
我在标题栏中添加了一个进度指示器,但现在我希望能够在用户单击它时取消该操作。
有没有什么很好的方法可以做到这一点呢?(比如Thread.interrupt())目前我有一个静态的布尔值"running“,并且我已经重写了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分钟)
发布于 2013-03-14 23:41:20
我认为IntentService并不真正适合您的目的。相反,您可以根据特定启动命令直接扩展Service (http://developer.android.com/guide/components/services.html#ExtendingService)并清除消息队列(在本例中为Handler),并执行您的终止过程。
发布于 2015-05-25 13:22:56
对于这种情况,我想出了一个简单的解决方案,就是添加一个字段,后台线程( 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))为了正确,你也应该使设置和检查同步。
https://stackoverflow.com/questions/15413430
复制相似问题