1

我正在创建一个应用程序,在那里我需要处理可能很大并且可能需要一些时间的数据。中断IntentService

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

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

是否有这样做的一些优雅的方式?(有点像了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

为避免AsyncTasks这样做是正确的:从[documentation](https://developer.android.com/reference/android/)中,“AsyncTasks理想地应该用于短操作(最多几秒钟) os/AsyncTask.html) – Sam 2013-03-14 15:32:31

回答

2

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

+0

创建我自己的服务似乎有点矫枉过正。我真的不想要parralel执行(实际上它会导致问题)。但它似乎是唯一的干净方式。 – Radovan 2013-03-14 17:06:12

+1

@Radovan我不是在谈论并行执行 - 你可以自由地实现与IntentService相同的任务队列。只需根据您的需求进行定制 – 2013-03-14 17:12:03

2

我为这种情况提出的一个简单的解决方案是添加一个字段,后台线程(即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)) 

而且是正确的,你应该做的设置和检查同步了。