【发布时间】:2014-07-02 22:44:09
【问题描述】:
我正在尝试将多个文件从我的服务器下载到我的设备。
这是我所做的:
关于活动
...
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 可以从任何 Activity 多次启动(例如我想下载 file0、file1、...、fileN):这就是我使用线程在onHandleIntent中,以便单独下载它们。
这是我的问题:如何取消/中断从 IntentService 启动的特定线程的下载?下载过程中没有 UI 更新,只有一个带有进度条的 Notification,当然是从 Thread 更新的。
一个文件的大小可以为 1GB,我正在尝试撤消此下载。
编辑 1:
DownloadManager 非常有用,我知道,但是我的文件由多个子文件组成,这些子文件是由服务器在运行时一一创建的。我已经尝试过这种方式,但这不是我想要的。
【问题讨论】:
-
IntentService的用法不合适。一旦onHandleIntent()结束,您的IntentService组件就会被销毁,因此您正在泄漏线程。如果您想要一个具有多个线程的服务,请创建一个具有多个线程的Service(例如,ThreadPoolExecutor)。 -
如果您下载的文件大小可以为 1GB,那么您应该查看
DownloadManager类。更多信息可以在这里找到:developer.android.com/reference/android/app/… -
嗯,
ThreadPoolExecutor是标准 Java 的一部分。我没有试图担心停止池中的特定线程,因此我不知道其中的机制,但很有可能您可以在ThreadPoolExecutor和那个场景中找到搜索一般 Java 信息的东西。在 Android 端,您需要跟踪停止服务的正确时间(例如,当池空闲时),并且您应该考虑降低线程的优先级 (Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);)。 -
@CommonsWare 我认为 IntentService 比 Service 更好,但正如您所见,我发现了一条死胡同。谢谢你们的cmets!
-
您省略的
download code部分很重要,因为您要定期检查是否必须中断下载。该中断信号或事件可能由 UI 线程或其他一些组件触发(例如,如果一个下载填满了所有磁盘,或者如果网络中断),并且您希望您的线程能够捕获该事件通过在接收正在下载的文件块之间监视它。
标签: android multithreading intentservice