以前在个人文章《Android高速下载器实现思路——单个任务的提速与优化》提到了一些下载器的实现方式。而后由于这学期实验报告超级多,这个项目一鸽再鸽到如今基本成型了,作成了Android Library上传到了Jitpack。java
项目传送门git
欢迎下载sample体验、start。github
根目录的build.gradle
bash
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
复制代码
在module的build.gradle
中:多线程
dependencies {
implementation 'com.github.SirLYC:YC-Downloader:latest.release'
}
复制代码
在Application
中:异步
class App : Application() {
override fun onCreate() {
super.onCreate()
// multi process
YCDownloader.install(this, true)
// single process
// YCDownloader.install(this, false);
// or
// YCDownloader.install(this);
}
}
复制代码
到这里就已经启动了下载服务。下载服务是和Application Context绑定的,目前暂未提供退出服务的接口。maven
全部的接口都经过YCDownloader的静态方法导出,接口要么经过方法名就能够知道功能要么有相应的文档注释说明。ide
文件传送门post
若是还不清楚,项目中有一个现成的sample,涵盖了这个库常见的一些API的使用(做为纯粹的HTTP下载器,功能应该还算比较完整)。测试
须要注意的地方是,若是使用多线程,最好不要有其余组建运行在:yc_downloader
进程,这个进程在库的Manifest
已经注册为了远程下载服务运行的进程。
上一篇文章中有提到把读和写的线程分离,按照读、写线程n:1的方式组织。实际上在以前实现时,这样的方法最后达到的下载效率并非很高。
首先须要知道的是,读写线程分离确实能提高下载的速度,可是,读写线程比是一个重要的参数。在几回实验后发现,当读写线程为n:1时,读线程常常会被写线程拖慢,由于写线程只有一个,要处理多个线程下载下来的缓冲区的读。写完一个缓冲区后才能释放给某个读线程下载,而且还要被多个读线程竞争。
所以,改变这种局面的方式,一个是减少读写线程比(增多写线程),另外一个是使用双缓冲(理论上缓冲区能够适量继续增长,但通常双缓冲足够了,一个写一个读循环使用,毕竟空间有开销)。最后在实现中,采用的是每一个读线程对应一个写线程,而且有两个缓冲区。
最后经过这种方式测试,下载速度基本能够跑满带宽。