Android 中断从IntentService启动的特定线程

Android 中断从IntentService启动的特定线程,android,multithreading,intentservice,Android,Multithreading,Intentservice,我正在尝试将多个文件从服务器下载到设备 以下是我所做的: 关于活动 ... Intent intent = new Intent(this, DownloadService.class); intent.putExtra(DownloadService.URL, url); startService(intent); 下载服务类 public class DownloadService extends IntentService { ... @Override protecte

我正在尝试将多个文件从服务器下载到设备

以下是我所做的:

关于活动

...
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra(DownloadService.URL, url);
startService(intent);
下载服务类

public class DownloadService extends IntentService {
...
    @Override
    protected void onHandleIntent(final Intent intent) {
        new Thread(new Runnable() {
        @Override
        public void run() {
            // Download code...
        }
    }).start();
}
我的IntentService可以从任何活动启动多次(例如,我想下载文件0、文件1、…、文件n):这就是为什么我在OnHandleContent中使用线程来分别下载它们的原因

我的问题是:如何取消/中断从IntentService启动的特定线程的下载?下载过程中没有UI更新,只有一个带有进度条的通知,当然是从线程更新的

一个文件的大小可以是1GB,我正在尝试撤消此下载

编辑1:


DownloadManager非常有用,我知道,但我的文件由多个子文件组成,这些子文件在运行时由服务器逐个创建。我已经尝试过这种方法,但这不是我想要的。

最后我设法解决了我的问题

根据@commonware的建议(再次感谢!),我创建了一个
服务
,而不是
IntentService
,并且在每次由
onStartCommand
调用的特定类中使用
ThreadPoolExecutor
管理我的多个线程


长话短说:我遵循了这个项目,并从中获得了灵感。

这不是对
IntentService
的恰当使用。一旦
onHandleIntent()
结束,您的
IntentService
组件就会被销毁,因此您正在泄漏线程。如果您想要具有多个线程的服务,请创建具有多个线程的
服务
(例如,
ThreadPoolExecutor
)。如果您正在下载大小为1GB的文件,则应查看
DownloadManager
类。更多信息可以在这里找到:
ThreadPoolExecutor
是标准Java的一部分。我没有尝试过在池中停止特定线程,因此我不知道这方面的机制,但很有可能您可以在
ThreadPoolExecutor
和该场景中找到一些搜索一般Java信息的内容。在Android端,您需要跟踪正确的时间是什么时候停止服务(例如,当池空闲时),并且您应该考虑放弃线程的优先级(<代码>进程。StuthRead优先级(Process。thRead PrimyIy后台);)。但正如你所看到的,我发现了一条死胡同。谢谢你的评论!您输入的
下载代码
部分非常重要,因为您需要定期检查下载是否必须中断。该中断信号或事件可能由UI线程或其他组件触发(例如,如果一次下载填满了所有磁盘,或者网络已关闭),您希望线程能够通过在接收其正在下载的文件块之间监视该事件来捕获该事件。