我正在开发一款Android应用,目的是从2台服务器下载块(视频文件的一部分),按顺序附加(进入主视频)文件)每次下载后,最后播放此视频文件,同时继续下载..
当通过使用执行下载的两个不同线程(每个服务器一个)完成串行下载时,这很有效。我想知道如何实现上述目标,但同时下载,而不是串行。
即从服务器同时按顺序下载块。例如,在相同的时间段内下载chunk0,chunk1&来自server1的chunk2(比如说服务器2快3倍)和来自server2的chunk3,这样我们就可以在这段时间内完全使用2台服务器的所有可用带宽。并重复此过程,直到下载完所有块。
通过使用线程和连接,下载是串行的,如上所述。为了使它并发,我试图从每个线程中删除连接,但是它不按顺序下载块,也只从一个服务器下载,而不是从两个服务器下载。 AsyncTask不是一个解决方案,因为它也不会按顺序下载块。
那么,是否有任何方法可以实现并发和按顺序下载块,如上所述?有没有人做过像这样的项目,以确定答案?
答案 0 :(得分:0)
您可以在下载加速器中使用流行的技术。
通常,我们的想法是使用Range HTTP标头从每个服务器请求块。 (当服务器能够相应地处理Range标头时,服务器响应Accept-Ranges标头)。 (This blog has a good explanation about that)。
每个线程/ runnable / callable必须知道哪个块是它的职责(第一个字节位置+长度?),因为每个都必须在文件中编写自己的部分。
然后将做出决定,你可以:
在每个线程中使用RandomAccessFile的实例编写文件,显然将文件指针定位在其块的第一个字节位置(使用seek method)或..
确保您有一个唯一的工作线程(请参阅Executors和submit),该线程负责编写每个线程所说的字节。在撰写本文时,您将使用seek将文件指针移动到正确的位置,不会出现重叠错误。
注意:如果您希望能够在拥有第一个块时开始播放,可以在第一个块线程下载+写入完成后执行该代码。