Sgo*_*nks 15 queue android android-intent android-intentservice
我有一个调用意图服务的活动("ApplicationActivity")("DownloadService")
intentService在后台下载来自互联网的文件,但我希望能够中止特定的下载.........
所以我要说我把5个文件放在队列中:文件1,2,3,4,5
意图服务开始下载数字1,然后是第二个等等...... 1)有没有办法说意图服务中止你在方法句柄事件中当前正在做什么(在这种情况下下载文件) 1)并开始下载下一个?
2)是否可以从队列中删除元素,例如在下载文件1时,从队列中删除文件4,以便在数字3之后直接进入5?
不久,我需要一种方法来与队列通信来执行这两个简单的操作,但我没有在互联网上找到任何有用的东西:(
TNX
Joa*_*usa 19
谢谢@ user280560,我发现了一个基于你评论的解决方案:)
只是为了给出一个更具体的例子,我希望在某些情况下清除队列.
首先我将IntentService.java源从这里复制到我的项目中(不需要更改名称,你可以保留IntentService.java,只需导入你的而不是android的).然后我加了这个
public void clearQueue() {
Debug.PrintInfo(TAG, "All requests removed from queue");
mServiceHandler.removeMessages(0);
}
Run Code Online (Sandbox Code Playgroud)
到我的IntentService源.
现在,从我扩展IntentService的服务中,我想在将某个操作(登录)传递给服务时清除队列,所以我重写onStartMethod,如下所示:
@Override
public void onStart(Intent intent, int startId) {
if(intent.getAction().equals(ACTION_LOGIN)) {
//Login clears messages in the queue
clearQueue();
}
super.onStart(intent, startId);
}
Run Code Online (Sandbox Code Playgroud)
奇迹般有效 :)
希望它可以帮助某人......
Sgo*_*nks 12
我创建了我自己的MyIntentService类,复制了原始的非常简短的并且为了我自己的目的修改方法........特别是为了使一个元素出列,你可以在我的情况下使用ServiceHandler的方法
mServiceHandler.removeMessages(appId) ;
使用消息队列中的某些代码"what"删除任何待处理的消息帖子,这意味着您必须在队列中添加每条消息,并在每条消息的"what"字段中添加一个标识符... ..例如
public void onStart(Intent intent, int startId)
{
super.onStart(intent, startId);
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside
Run Code Online (Sandbox Code Playgroud)
扩展 IntentService 类并在其上声明一个已取消项目的列表,每当您想取消某项时,将其添加到此列表中。最后,在处理您的意图之前,请确保它没有被取消!
public class MyDownloadService extends IntentService {
private static List<String> canceledUrl;
public static void cancelDownload(String url){
canceledUrl.add(url);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
final String url = intent.getStringExtra(EXTRA_URL);
if(!canceledUrl.contains(url)) //if download has not been canceled already
downloadFile(url);
else
canceledUrl.remove(url);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码有效,因为我之前测试过它,但我不确定这是正确的方法!