如何在单击按钮时取消ExecutorService的任务?

时间:2015-09-14 13:58:09

标签: android executorservice futuretask

我有一个项目列表,用户可以点击下载。 我正在使用此代码:

//Maintained this in my ListAdapter class so that if user clicks on cancel download i can do:
// tasks.get(info.getFieldID()).cancel(true);

public static Map<String, Future<Object>> tasks = new HashMap<String, Future<Object>>();
    Future f = downloadExecutor.submit(new Callable<Object>() {
         // do downloading.
    }
    tasks.put(key,f);

我试图在用户点击取消时通过调用取消相应的下载 tasks.get(键).cancel(真);

但是我的任务没有被取消。

几个问题:

1)我是否通过维护适配器类中的未来对象列表而做错了什么?

2)当用户点击按钮时,我应该如何取消任务?

3)我怎么知道任务已被取消?

我已经阅读过关于ExecutorService的内容,但我对实现感到困惑。

一些帮助表示赞赏!

谢谢, 斯纳

1 个答案:

答案 0 :(得分:0)

你真的在一起问几个问题。问题背后的逻辑似乎是将物理操作(按下按钮)与可执行操作(取消任务)连接起来。

简单来说,您似乎认识到需要存储对任务的引用才能取消它。在伪代码中(因为您的特定实现可能不同),您需要以下内容:

Button myButton = (Button)findViewById(R.id.mybutton);
myButton.setOnClickListener(new OnClickListener() {
    @Override
    onClick(View v) {
        tasks
             // retrieve the proper task based on the button
             .get(oneKey)
             // once you have the task, cancel it
             .cancel(true);
    }
});

在上面的代码中,每个按钮都与您选择的任务相关联,您可以通过硬编码或传递变量来完成。

使用哈希表,检索所需的任务。然后使用其cancel方法取消它。