Android 并行运行多个后台任务的相同意图服务(问题)

Android 并行运行多个后台任务的相同意图服务(问题),android,android-service,android-intentservice,Android,Android Service,Android Intentservice,这是我的意图服务,我正在使用它下载文件并解析它。现在,如果我收到一个新的文件下载请求,我必须清除正在进行的任务,并开始下载新的请求,取消旧的请求。因此,我使用以下代码来执行此操作: public class DataManager extends IntentService { @Override public void onCreate() { super.onCreate(); } @Override public int onSta

这是我的意图服务,我正在使用它下载文件并解析它。现在,如果我收到一个新的文件下载请求,我必须清除正在进行的任务,并开始下载新的请求,取消旧的请求。因此,我使用以下代码来执行此操作:

public class DataManager extends IntentService {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    public DataManager() {
        super("DataManager");
        setIntentRedelivery(true);
    }

    @Override
    protected void onHandleIntent(final Intent intent) {
        // download and parsing task done here
    }
}
因此,服务被终止,下一个启动服务的请求被指定。但是前面的任务会再次开始运行两个并行任务来执行下载。基本上,前一个任务不会被我想要的杀死


是否有任何方法可以终止正在进行的服务任务并启动另一个新任务

您正在设置
setIntentRedelivery(true)
,如果未完全处理意图(如果
OnHandleContent
无法返回),则强制意图在服务调用后生存。考虑到IntentService只有一个工作线程(一次只能执行一个任务),服务的行为完全取决于
OnHandleContent
实现。所以您需要分析实现并根据您的目标进行更改,或者设置
setIntentRedelivery(false)

不要使用
IntentService
。这不符合您的要求
IntentService
是一种简单的
服务
,它接受工作队列并处理队列,然后在队列为空时自动关闭


你需要更多的智慧,你最好自己去实现。只需
扩展服务
,而不是
IntentService
。在
onStartCommand()
中启动下载数据的后台
线程。在
服务
的成员变量中跟踪该后台
线程
。如果再次调用
startService()
,请检查您是否已在进行下载。如果是这样,请停止它并启动新的后台
线程
,以下载新文件。要停止后台线程,您应该在
线程
中提供一个
布尔
变量,该变量在下载循环中时不时地被检查。如果该变量的状态发生变化,则表示
线程应该停止。这是Java中停止后台线程的标准机制。

据我所知(文档中也有说明),一次只能执行一个任务。因此,onHandleIntent实现中可能存在错误。您能详细说明一下如何加载文件吗?我通过改造调用从s3下载了多个文件,然后一个接一个地存储在数据库中。改造调用是否同步?否则,服务不负责他们的进度。您还希望通过改装本身取消请求。顺便问一下,您如何理解两个任务并行执行?是的,retofit运行在另一个线程中,而该服务不是它的父线程。As服务不是产生该线程的进程。所以杀戮服务没有帮助。我不得不终止在不同线程中运行的改装服务。这就解决了问题。谢谢Aleksandr MadvedevI我也试过了。但是,当我开始下一个意图时,进度意图会再次出现,一次产生两个过程是的,之前已经解决了。。感谢您的投入和解决方案
private void refreshSync() {
    context.stopService(new Intent(context, DataManager.class));
    final Intent mServiceIntent = new Intent(context, DataManager.class);
    mServiceIntent.putExtras(bundle);
    context.startService(mServiceIntent);
}