【问题标题】:Interrupt a specific Thread launched from IntentService中断从 IntentService 启动的特定线程
【发布时间】: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


【解决方案1】:

我终于设法解决了我的问题。

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

长话短说:我关注了this Google guide,并受到ThreadSample 项目的启发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多