urS*_*Sus 12 service android intentservice
我有一个意图服务,下载几千兆字节的视频.我有一个"停止"按钮,如果意外点击"开始"或其他什么,停止下载.我知道这已被问过几次,但对我没有工作答案.
我试着打电话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;
}
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后触发它
Intent intent = new Intent(context, SyncService.class);
intent.putExtra("action", "cancel");
context.startService(intent);
Run Code Online (Sandbox Code Playgroud)
Com*_*are 12
你会有两个不同的问题,我想:
如何停止当前下载
如何停止排队下载,这应该在当前完成之后执行
第一个必须是"像旗子一样",在下载数据时检查.否则,什么都不会阻止您的下载操作.如果您使用的是典型HttpUrlConnection配方,则在循环中检查该标志,从HTTP中读取InputStream并写入您的FileOutputStream.您可以通过调用startService()特定Intent结构来设置该标志,将其标识为"取消"操作.你需要重写onStartCommand()你的IntentService,看Intent,用它来设置的标志,如果是取消Intent,或链超类的任何其他种类的Intent.
如果您还有其他排队的命令(场景#2),您还需要检查顶部的那个标志onHandleIntent().