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);
}