Java Android多线程下载n个后台资源

Java Android多线程下载n个后台资源,java,android,multithreading,round-robin,Java,Android,Multithreading,Round Robin,我正在开发一个android应用程序,最初它从服务器下载所有应用程序资源并保存在数据文件夹中,在后台下载。当用户在包含gridview的片段之间导航时,下载的资源将显示在网格项(imageview)中,否则它将显示加载循环,指示资源处于下载状态 下面是我如何设计下载管理器的 使用ThreadPoolExecuter以默认大小创建4个线程和PriorityBlockingQueue。每个线程都有一个大小为5的队列。在这里,循环函数将检查每个线程队列,并将任务添加到具有空闲队列空间的线程中 有没有人

我正在开发一个android应用程序,最初它从服务器下载所有应用程序资源并保存在数据文件夹中,在后台下载。当用户在包含gridview的片段之间导航时,下载的资源将显示在网格项(imageview)中,否则它将显示加载循环,指示资源处于下载状态

下面是我如何设计下载管理器的

使用ThreadPoolExecuter以默认大小创建4个线程和PriorityBlockingQueue。每个线程都有一个大小为5的队列。在这里,循环函数将检查每个线程队列,并将任务添加到具有空闲队列空间的线程中

有没有人能帮我实现上述要求,提供指针、示例伪代码(如示例)

我实现了上面的场景,但我在“每个线程都有一个大小为5的队列。在这里,循环函数将检查每个线程队列,并将任务添加到有空闲队列空间的线程”这一领域上遇到了困难


我已经考虑了2天,如何使用自己的队列实现线程,该队列需要通过循环方法由PriorityBlockingQueue填充。

我在3个月前使用了这个库,它非常棒的库,如多资源下载并行,如whatsApp

我也做了同样的事情,但不久前用的是Pdf文件。首先,您需要选择一个好的Http客户机库来执行下载,并且忘记所有与下载相关的问题,如果您自己执行此操作,您将遇到这些问题。我建议你使用Ion Library,它有很多有用的功能,比如取消下载,附加回调以查看下载进度,知道下载是否成功,失败等等

其次,您显然需要一个在后台运行的服务,通常,您可以通过创建自己的服务来实现这一点,而且android清单中的服务进程名称必须类似于android:name=“com.company.app.services.MyService”,而不是像android:name=“:MyRemoteService”这样做可以确保服务始终在后台运行(请记住,操作系统可以并且会在必要时终止服务,但当资源再次可用时,服务将重新启动)

第三,要使显示这些文件的所有视图、自定义视图、活动、片段等保持更新,您需要从服务中获取触发器广播接收器。请记住,这样做不能使用LocalBroadcastReceiver,因为您的服务有自己的独立于应用程序的进程

1) 没有必要显式地使用活动,您可以在任何您认为合适的地方注册您的广播。回收器适配器(最有可能)、片段或活动

2) 通信应用程序/服务是通过Intents完成的,因此您向服务发送和从服务发送的所有数据都必须是可序列化的

3) 您可以使用几种不同类型的广播,每种广播都适用于不同的情况(错误、失败、成功、进度等),或者您可以仅使用一种广播,并在从服务触发广播时通过意向包发送描述这种状态的枚举

希望这对你有帮助,如果你有任何疑问,请告诉我


关于图书馆的更多信息

我将在3个月前使用这个图书馆,它是一个非常棒的图书馆,类似于多资源下载,类似于whatsApp

我也做了同样的事情,但不久前用的是Pdf文件。首先,您需要选择一个好的Http客户机库来执行下载,并且忘记所有与下载相关的问题,如果您自己执行此操作,您将遇到这些问题。我建议你使用Ion Library,它有很多有用的功能,比如取消下载,附加回调以查看下载进度,知道下载是否成功,失败等等

其次,您显然需要一个在后台运行的服务,通常,您可以通过创建自己的服务来实现这一点,而且android清单中的服务进程名称必须类似于android:name=“com.company.app.services.MyService”,而不是像android:name=“:MyRemoteService”这样做可以确保服务始终在后台运行(请记住,操作系统可以并且会在必要时终止服务,但当资源再次可用时,服务将重新启动)

第三,要使显示这些文件的所有视图、自定义视图、活动、片段等保持更新,您需要从服务中获取触发器广播接收器。请记住,这样做不能使用LocalBroadcastReceiver,因为您的服务有自己的独立于应用程序的进程

1) 没有必要显式地使用活动,您可以在任何您认为合适的地方注册您的广播。回收器适配器(最有可能)、片段或活动

2) 通信应用程序/服务是通过Intents完成的,因此您向服务发送和从服务发送的所有数据都必须是可序列化的

3) 您可以使用几种不同类型的广播,每种广播都适用于不同的情况(错误、失败、成功、进度等),或者您可以仅使用一种广播,并在从服务触发广播时通过意向包发送描述这种状态的枚举

希望这对你有帮助,如果你有任何疑问,请告诉我


有关图书馆的更多信息,我不太清楚你为什么要这样做。吞吐量的限制不是处理(您根本没有提到处理文件)其带宽。通过一次下载多个内容,您可以在多个传输之间分配带宽。我不认为这会比一个线程一次下载一件东西快。从这个意义上讲,文件将主要是图像。更重要的是,我需要并行下载图像。再说一遍,为什么?您的限制因素将是带宽。正在下载