16

我有一个调用意图服务(“DownloadService”)的活动(“ApplicationActivity”)

IntentService 在后台从互联网下载文件,但我希望能够中止特定的下载............

因此,假设我将 5 个文件放入队列中:文件 1、2、3、4、5

意图服务开始下载数字 1,然后是第二个,依此类推.... 1)有没有办法让意图服务在方法句柄事件中中止您目前正在做的事情(在这种情况下下载文件1) 并开始下载下一个?

2)是否可以从队列中删除元素,例如在下载文件1时,从队列中删除文件4,以便在数字3之后直接进入5?

很快,我需要一种与队列通信的方法来执行这两个简单的操作,但我在互联网上没有发现任何有用的东西:(

肿瘤坏死因子

4

5 回答 5

19

谢谢@user280560,我根据您的评论找到了解决方案:)

只是举一个更具体的例子,我想在某些情况下清除队列。

首先,我将 IntentService.java 源从这里复制到我的项目中(无需更改名称,您可以保留 IntentService.java,只需导入您的而不是 android 的)。然后我添加了这个

public void clearQueue() {
    Debug.PrintInfo(TAG, "All requests removed from queue");
    mServiceHandler.removeMessages(0);
}

到我的 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);
}

奇迹般有效 :)

希望它可以帮助某人...

于 2012-05-23T10:02:51.370 回答
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
于 2011-10-25T17:36:51.503 回答
5

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

我知道这段代码有效,因为我之前测试过它,但我不确定这是一种正确的方法!

于 2014-12-23T14:27:37.160 回答
1

您可以绑定到意图服务并创建一个方法来取消或取消下载。

是您可能需要的快速教程

于 2011-09-06T11:16:19.530 回答
0

正如上面@JeffreyBlattman 所说,最好通过将自己的“what”值分配给这样的消息来确保安全

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        msg.what = 0;
        mServiceHandler.sendMessage(msg);
    }

并清除队列,如mServiceHandler.removeMessages(0)

希望有帮助。

于 2018-01-08T15:04:39.490 回答