我正在创建一个应用程序,我需要处理的数据量很大,可能需要一些时间。
现在我在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分钟)
答案 0 :(得分:2)
我认为IntentService
并不适合您的目的。相反,您可以直接扩展Service
(http://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))
而且要正确,你应该进行设置并检查同步。