我有一个意图服务,下载几千兆字节的视频。我有一个“停止”按钮,如果意外点击“开始”或其他什么,停止下载。我知道这已被问过几次,但对我没有合适的答案。
我尝试拨打stopService()
,但无效。这只是调用IntentService.OnDestroy()
。
我试图在stopSelf()
内拨打onDestroy
,但也无效。
我尝试过像标志一样的东西,但如果onHandleIntent已经在运行,它就不会被调用,它会等到当前工作完成然后再执行。即使这会有效,我也必须拥有类似巨型if语句的东西,这很糟糕
我唯一的选择是将其重写为常规服务吗?
//应答
public class SyncService extends IntentService {
boolean isCanceled;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.hasExtra("action")) {
// Set the canceling flag
isCanceled= intent.getStringExtra("action").equals("cancel");
}
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onHandleIntent(Intent intent) {
// Clean up the possible queue
if (intent.hasExtra ("action")) {
boolean cancel = intent.getStringExtra ("action"). Equals ("cancel");
if (cancel) {
return;
}
}
...
Get your inputStream from HttpUrlConnection or whatever
...
while ((bytesRead = in.read(buffer)) > 0) {
if (isCanceled) {
isCanceled = false;
break;
}
...
}
}
}
用
触发它Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);
答案 0 :(得分:12)
我想有两个不同的问题:
如何停止当前下载
如何停止排队下载,应在当前完成后执行
第一个必须是“像旗子一样”,在下载数据时检查。否则,什么都不会阻止您的下载操作。如果您使用的是典型的HttpUrlConnection
食谱,请在循环中检查您从HTTP InputStream
读取的标记并写入FileOutputStream
。您可以通过调用具有特定startService()
结构的Intent
来设置该标志,并将其标识为“取消”操作。您需要覆盖onStartCommand()
中的IntentService
,查看Intent
,如果是取消Intent
则使用它来设置标记,或者链接到超类{任何其他类型的Intent
。
如果您也可能有其他排队的命令(场景#2),您还需要在onHandleIntent()
的顶部检查该标志。
答案 1 :(得分:2)
鉴于你没有发布 你正在处理视频下载,这可能不起作用(onHandleIntent
内部会有一些循环执行下载)。您可以在IntentService
内部使用静态类变量来保存下载的停止/启动状态,以便可以通过Activity
进行设置。然后,在onHandleIntent
内,您必须定期检查状态,以便知道何时取消操作。