精华内容
下载资源
问答
  • 2019-09-09 13:40:48

    下载队列在Android中可以说是非常常见了,常见的做法是将下载任务放到服务中,创建线程任务队列,对其进行处理,这样子问题也有很多,比如常见的线程安全之类的。并且考虑到线程创建和关闭对资源的消耗,我们还要维护一个线程池。同时实现动态像队列中添加任务,采用生产者-消费者模式。非常复杂。

    今天采用kotlin来实现一个可以随时添加下载任务的下载队列。

    知识点

    • 协程

    • 通道

    • Android service

    如果对于协程和通道不明白的可以参考kotlin官方文档

    思路

    首先创建一个Android Service,onBind返回null,因为不需要绑定任何activity。重写onCreate函数,onStartCommand函数。

    class DownloadService : Service(), CoroutineScope by MainScope() {
    	override fun onBind(intent: Intent): IBinder? {
            return null
        }
        override fun onCreate() {
            super.onCreate()
        }
        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        }    
    }
    

    简单说明onCreate和onStartCommand函数:

    • onCreate : 在服务首次开启时调用一次,之后不再调用
    • onStartCommand :每次调用startService()都会调用一次

    这样就非常清晰了,在onCreate方法中实现下载队列,在onStartCommand 方法中添加下载队列。

    /**
     * 声明下载通道
     */
    private val downLoadChannel = Channel<String>()
    
    /**
     * 添加下载任务
     */
    private suspend fun addDownloadTask(down: String) {
        count++
        Log.d(TAG, "增加:$down,当前任务数:$count")
        downLoadChannel.send(down)
    }
    

    我们只要在onStartCommand中调用添加下载任务就行了

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        launch {
            c++
            Log.d(TAG, "准备增加")
            addDownloadTask("下载任务$c")
        }
        return super.onStartCommand(intent, flags, startId)
    }
    

    在onCreate中,我们需要创建一个在IO线程中的协程来处理下载任务。每当任务处理完毕之后调用销毁程序关闭任务,销毁程序需要先等待11s检查是否没有任务添加了,如果是在等待5s中确认真的没有任务添加之后,关闭通道和服务进程。

    @ExperimentalCoroutinesApi
    suspend fun processingDownloadTasks() {
        while (!downLoadChannel.isEmpty) {
            val down = downLoadChannel.receive()
            Log.d(TAG, "正在下载:$down")
            // 模拟下载
            delay(1000)
            count--
        }
        waitingToStop()
    }
    
    @ExperimentalCoroutinesApi
    suspend fun waitingToStop() {
        Log.d(TAG, "等待...${downLoadChannel.isEmpty}")
        delay(11000)
        Log.d(TAG, "每11s检查是否有下载任务,当前任务:${downLoadChannel.isEmpty}")
        if (downLoadChannel.isEmpty) {
            Log.d(TAG, "没有下载任务,最后5s到底有没有,当前任务:${downLoadChannel.isEmpty}")
            delay(5000)
            Log.d(TAG, "延迟,当前任务:${downLoadChannel.isEmpty}")
            if (downLoadChannel.isEmpty) {
                Log.d(TAG, "真的没有下载任务,我要关闭了")
                downLoadChannel.cancel()
                // 停止
                stopSelf()
                return
            }
        }
        processingDownloadTasks()
    }
    
    override fun onBind(intent: Intent): IBinder? {
        return null
    }
    
    @ExperimentalCoroutinesApi
    override fun onCreate() {
        super.onCreate()
        Log.d(TAG, "启动服务")
    
        launch(Dispatchers.IO) {
            processingDownloadTasks()
        }
    }
    

    在activity中随时都可以调用startService来开启下载进程。

    startService<DownloadService>()
    

    运行效果

    启动服务
    等待...true
    准备增加
    增加:下载任务1,当前任务数:1
    准备增加
    增加:下载任务2,当前任务数:2
    准备增加
    增加:下载任务3,当前任务数:3
    准备增加
    增加:下载任务4,当前任务数:4
    每11s检查是否有下载任务,当前任务:false
    正在下载:下载任务1
    准备增加
    增加:下载任务5,当前任务数:5
    正在下载:下载任务2
    正在下载:下载任务3
    正在下载:下载任务4
    正在下载:下载任务5
    等待...true
    准备增加
    增加:下载任务6,当前任务数:1
    每11s检查是否有下载任务,当前任务:false
    正在下载:下载任务6
    等待...true
    每11s检查是否有下载任务,当前任务:true
    没有下载任务,最后5s到底有没有,当前任务:true
    延迟,当前任务:true
    真的没有下载任务,我要关闭了
    关闭服务
    
    更多相关内容
  • 图片下载队列控制器 ------ 原因 ------ 1、对于需显示图片的TableView,为了避免快速滑动时同时下载太多图片,需可控制同时下载的数量。 2、经常都有多个页面需要这样的功能,所以做了一个统一控制图片下载数量的类...
  • 主要为大家详细介绍了Java语言实现简单FTP软件,FTP上传下载队列窗口的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Android 消息队列模型详解及实例 Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper)。Android中除了UI线程(主线程...
  • kafka队列下载

    2017-08-25 10:31:09
    kafka_2.12-0.11.0.0
  • 本代码主要是管理下载任务。提供了最基础的下载服务。 最新代码请到我的github上下载 https://github.com/agelessman/MCDownloadManager
  • 多文件队列下载简单例子
  • 照片多选,下载队列,进度显示
  • Unity3d 队列 方法 Queue

    2017-09-22 11:09:48
    Unity3d 队列 方法 Queue
  • 简单下载,支持队列下载 断点续传
  • 安卓稳定多线程文件下载,加入线程队列 使用简单
  • iOS异步队列下载

    2013-12-30 11:46:31
    ASI封装的多线程队列下载 可以同时进行多个任务
  • 基础知识 在Internet上,我们要下载网站上的某个资源,我们会获得一个URL(Uniform Resource Locator),它是一个服务器资源定位的描述,下载的过程总是如下步骤: 步骤1:客户端发起连接请求一个URL 步骤2:服务器...
  • 打开IDM下载器,单击菜单中的“队列”,可以看到在左侧有2个主要队列:下载队列和同步队列,如图1。 图 1:队列按钮 大家还可以创建任意数量的附加队列。 选中“队列”,单击右键,选择“创建新队列”,如图2。 ...

    使用IDM下载器中的队列功能,可以帮助大家快速分类下载任务,这样,就可以统一管理有同样下载需求的内容。

    一、队列的添加及设置

    打开IDM下载器,单击菜单中的“队列”,可以看到在左侧有2个主要队列:下载队列和同步队列,如图1。

    图 1:队列按钮

    大家还可以创建任意数量的附加队列。 选中“队列”,单击右键,选择“创建新队列”,如图2。

    图 2:创建新队列

    创建完成后,就生成了新的队列。此时,双击队列名称,就可以进入此队列的设置界面,如图3。可以设置下载/同步队列的开始和停止时间,或是手动启动和停止下载队列,只需要选中需要设置的列表,右键,选择需要的功能即可。   

    图 3:设置界面

    设置完成后,点击关闭,就可以将设置应用在选中的队列上了。如果队列计划开始,则其图标有一个小时钟标志。   

    二、如何启动/停止队列

    添加要下载的新文件时,默认情况下,IDM会将其添加到主下载队列,下载完成后,会从下载队列中自动删除该文件。

    还可以通过以下方式启动(停止)队列处理:

    可以使用工具栏上“开始队列”和“停止队列”按钮附近的下拉按钮来启动/停止其他队列。单击下拉按钮时,将显示要从中选择的队列列表,如图4有同步队列和#队列3可以使用。   

    图 4:下拉菜单

    也可以从IDM主菜单中选择“下载->开始队列->[对应队列名称]”或“下载->停止队列->[对应队列名称]”菜单项,也可以达到相同的效果。                  

    还可以在“计划任务”对话框中设置启动队列的时间以及停止队列处理的时间。

    展开全文
  • 自PS5发布以来,许多PS5用户反映遇到了下载队列bug,这导致PS5游戏陷入「排队等待下载」或「下载错误」的情况,两者都会提示玩家检查下载菜单,但下载菜单里什么都没有。今日索尼为所有遇到问题的玩家提供了解决办法...

      自PS5发布以来,许多PS5用户反映遇到了下载队列bug,这导致PS5游戏陷入「排队等待下载」或「下载错误」的情况,两者都会提示玩家检查下载菜单,但下载菜单里什么都没有。今日索尼为所有遇到问题的玩家提供了解决办法。一起来看看ps5下载队列错误怎么办?索尼提供解决PS5下载bug的方法

    ps5下载队列错误怎么办?索尼提供解决PS5下载bug的方法

      以前,下载队列错误的唯一已知解决方案是完全恢复出厂设置,但是这使用户不得不重新下载其所有软件。周四,PlayStation的支持帐户提供了一种解决该问题的方法,不需要恢复出厂设置。

      ps5下载队列错误解决办法:以安全模式启动其PS5主机,之后选择重建其数据库。重新启动后,下载队列问题应该就能够得到解决。

    各位看官,以上就是游综宅给大家带来的关于ps5下载队列错误怎么办?索尼提供解决PS5下载bug的方法的全部内容啦!如果您想了解更多海内外手游攻略主机游戏资讯二次元资讯。欢迎关注(游综宅手游网)哦!

    展开全文
  • 使用 js 实现 队列

    千次阅读 2022-02-02 22:07:25
    队列是一种特殊的列表,队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出。 参数 接收的参数为数组类型。 属性及方法 栈的抽象数据类型定义 列表 属性或方法 描述 enqueue ...

    队列是一种特殊的列表,队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出。

    参数

    接收的参数为数组类型。

    属性及方法

    栈的抽象数据类型定义

    列表属性或方法描述
    enqueue方法向队尾加入一个元素
    dequeue方法删除队首的元素
    front方法读取队首元素
    back方法读取队尾元素
    toString方法返回队列的字符串形式
    clear方法清空队列
    length方法返回队列内元素的个数
    empty方法队列是否为空

    下面看下代码实现:

    /**
     * 简单队列
     */
    // ES5
    function Queue(data = []) {
      this.dataStore = data
      this.enqueue = enqueue
      this.dequeue = dequeue
      this.front = front
      this.back = back
      this.toString = toString
      this.clear = clear
      this.length = length
      this.empty = empty
    }
    
    function enqueue(element) {
      this.dataStore.push(element)
    }
    
    function dequeue() {
      return this.dataStore.shift()
    }
    
    function front() {
      return this.dataStore[0]
    }
    
    function back() {
      return this.dataStore[this.length() - 1]
    }
    
    function toString() {
      return this.dataStore.join()
    }
    
    function clear() {
      this.dataStore = []
    }
    
    function length() {
      return this.dataStore.length
    }
    
    function empty() {
      return !this.dataStore.length
    }
    
    // ES6
    class Queue6 {
      constructor(data = []) {
        this.dataStore = data
      }
    
      enqueue(element) {
        this.dataStore.push(element)
      }
    
      dequeue() {
        return this.dataStore.shift()
      }
    
      front() {
        return this.dataStore[0]
      }
    
      back() {
        return this.dataStore[this.length() - 1]
      }
    
      toString() {
        return this.dataStore.join()
      }
    
      clear() {
        this.dataStore = []
      }
    
      length() {
        return this.dataStore.length
      }
    
      empty() {
        return !this.dataStore.length
      }
    }
    

    队列演示示例可查看 例子

    优先队列

    在某些情况下,队列需要按照优先级进行排序、出队列,这个时候需要在入队列的时候按照一定的优先级规律进行排序,实现如下:

    /**
     * 带优先级的队列,代码中使用 code 表示,数值越大,优先级越高,默认优先级为 0
     * 优先级越高,提前出队列,优先级相同,则按照入队列的顺序出队列
     * 例如 医院 挂号,病重的会优先
     */
    // ES6
    class Element {
      constructor(name, code = 0) {
        this.name = name
        this.code = code
      }
    }
    
    class QueueComplex {
      constructor() {
        this.dataStore = []
      }
    
      enqueue(element) {
        const dataStore = this.dataStore
        let entry = dataStore.length
        for (let i = dataStore.length - 1; i >= 0; i--) {
          if (i - 1 >= 0) {
            if (element.code > dataStore[i].code && element.code <= dataStore[i - 1].code) {
              entry = i
            }
          } else {
            if (element.code > dataStore[i].code) {
              entry = i
            }
          }
        }
        this.dataStore.splice(entry, 0, element)
      }
    
      dequeue() {
        return this.dataStore.shift()
      }
    
      front() {
        return this.dataStore[0]
      }
    
      back() {
        return this.dataStore[this.length() - 1]
      }
    
      toString() {
        const dataStore = this.dataStore
        let res = ''
        for (let i = 0, len = dataStore.length; i < len; i++) {
          res += `{ name: ${dataStore[i].name}, code: ${dataStore[i].code} }`
        }
        return res
      }
    
      clear() {
        this.dataStore = []
      }
    
      length() {
        return this.dataStore.length
      }
    
      empty() {
        return !this.dataStore.length
      }
    }
    

    优先队列演示示例可查看 例子

    展开全文
  • IDM使用队列下载多个百度云文件

    千次阅读 2020-06-05 11:58:04
    问题 如图,idm正在下载一个百度云文件时,再次申请下载其他文件时会出现以下情况: 解决方法 ...最后打开idm选择开始队列,之前申请的一系列文件就开始下载: 可以看到,多个文件正在同时下载中 ...
  • 多线程进度下载文件源码,鱼刺模块队列和信号量的运用
  • 队列多线程下载图片

    2018-01-24 10:19:34
    简介:本程序采用队列多线程下载大量图片,线程通过线程池提供。下载程序先访问mysql数据库中存放的图片地址(可根据需要改成HTTP网络图片地址),解析后存放到队列中,以供下载图片的线程调用。然后下载图片的线程...
  • ios实现简易队列

    2021-01-03 13:48:32
    本文实例为大家分享了ios实现简易队列的具体代码,供大家参考,具体内容如下 满足一些特殊需求 接口部分(队列支持需求) #import @interface XMQueue : NSObject ///队列追加 - (void)add:(id) obj; ///队列取出 - ...
  • 详细了解IDM的队列功能

    千次阅读 2020-10-29 16:18:46
    IDM(Internet Download Manager)下载器的队列分为2种:主要下载队列和同步队列。此外,我们也可以自己创建附加队列。 在左边的【分类】窗口中,黄色的图标为主要下载队列,绿色的图标则为同步队列。如果队列已经...
  • 用Java实现HTTP文件队列下载.pdf
  • RabbitMQ实战 高效部署分布式消息队列 高清完整版下载PDF下载
  • 数据结构队列头文件

    2017-04-25 15:21:04
    数据结构队列头文件,包含队列的基本操作函数
  • 最近的项目是一个与音乐相关的App,...最初的思路便是任务队列,单线程顺序执行,一个文件接着一个文件进行下载。之前看过AsyncTask的部分源码,其设计与我的想法类似,于是便借鉴着AsyncTask的源码,实现了一个特别
  • rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。
  • 1、首先看一下队列窗口的界面   2、看一下上传队列窗口的界面   3、看一下下载队列窗口的界面   4.队列窗口的实现 package com.oyp.ftp.panel.
  • web队列源码,支持多个浏览器,适用于解决订单并发问题

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 209,876
精华内容 83,950
关键字:

下载队列

友情链接: FrCSA.rar