【问题标题】:Service / IntentService for uploading large(2 GB) files to server in androidService / IntentService 用于将大(2 GB)文件上传到android中的服务器
【发布时间】:2019-07-10 19:55:55
【问题描述】:

我应该使用什么来将大文件上传到服务器,即服务或意图服务。

我觉得 Intententservice 是上传大文件的正确方法,因为

1) 它创建的是自己的工作线程

2) 上传后无需停止服务自动停止

如果我要参加服务,我们确实有以下提到的一些优点:

1) 我们可以在服务内创建一个线程用于上传大文件

2) 如果需要,我们可以在上传时并行执行任务

3)如果假设在上传操作系统时发生内存不足(OUM)可以重新创建我们的服务但是对于 IntentService 我们没有这个权限,我猜

所以请各位大侠提出你的意见,我应该使用哪一个来上传大文件。

【问题讨论】:

  • 你会以某种方式通知用户数据正在上传吗?如果是这种情况,请使用前台服务,因为即使在内存不足的情况下也可以避免使用这些服务。所以操作系统不会试图杀死你的服务
  • 我们可以单独使用前台服务还是在intentservice中使用?
  • 其实intentservice也扩展了Service类。因此,要使用前台服务,只需创建一个普通服务并在其中使用 startForeground 方法并传递 id 和通知对象

标签: android service intentservice


【解决方案1】:

尝试将前台服务用于长时间运行的任务。因为android优先于前台服务而不是启动服务。在android客户端遵循以下逻辑

  1. 创建一个内部有线程实现的服务。
  2. 将服务作为前台。
  3. 尝试在Http连接中设置chunk长度
  4. 尝试创建支持“恢复上传”的网络服务

要设置块大小,

httpurlConnection.setChunkedStreamingMode(buffersize)

通过设置块大小,我们可以限制内部缓冲以避免OOM。

要了解有关实施简历上传选项的知识,请参阅 this

【讨论】:

    【解决方案2】:

    我觉得数据很大(2GB),应该通过IntentService上传。

    为什么?如果您使用Service,那么它将并行正常工作,但在任何情况下,如果您从后台杀死您的应用程序,那么您的服务将停止马上。

    如果你使用 IntentService 那么它会继续它的任务直到它完成,如果你从后台终止进程也没问题。我认为这非常重要。

    你上面提到的最好的部分是它在不同的线程中工作,所以不会影响MainThread

    你应该使用 IntentService,我的建议,祝你好运:)

    【讨论】:

    • 是的,这就是为什么我建议使用IntentService,如果你从最近的标签中杀死它不会停止,但Service会停止。
    • 感谢您的宝贵建议,我猜在我们不使用一些前台服务使用通知之前,intentservice 也会被杀死,我们也可以将它与服务一起使用,不是吗?
    • ForegroundService 如果你在Service 中使用它比这两个要好得多。但是我已经测试了IntentService,它不会被杀死最近的应用程序杀死,直到完成它的任务。
    • 在我的情况下,intentservice 一直存在,直到应用程序出现在最近的选项卡中,但是一旦我们从最近的选项卡中删除它就会被杀死(据您所知,我们没有在 intentservice 中运行任何前台服务)
    猜你喜欢
    • 2012-08-10
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多