基于libcurl的资源下载
填坑。。。
先看看这个下载管理器的代码:

最基础的是DownloadObject,记录着要下载的资源中任意资源文件的网络链接,本地地址,标签,一个数据指针,下载的百分比,是否已经下载。
DownloadSucceedMessage、DownloadProcessMessage和DownloadErrorMessage分别记录着下载成功后、下载中、下载错误的DownloadObject,还有一个DownloadManger。
DownloadMessage用来发送消息给主线程,记录着例如下载中,下载失败,下载成功。
DownloadHelper,其中保存着一个消息队列,我刚开始使用pthread的线程锁,后来改为C++11的线程锁。不同游戏,只要在其中加入游戏主线程,让其每帧调用update,在其中将消息队列中的消息拿出来,根据消息的类型调用不同函数进行通知。例如下载中就根据DownloadObject的百分比更新UI中的下载进度条,下载成功就根据DownloadObject的文件路径更新文件缓存,下载失败则记录错误信息并且发送错误信息到服务器端。
DownloadManager中,第一步要下载服务器端中的所有资源文件列表并记录下来,跟本地的资源文件对比,判断是否已经下载。然后用户可根据需要选择下载各种资源,或者直接下载未下载所有资源。
这个我做了两个,一个版本是根据选择使用multi curl开多个线程下载,后来觉得不必要,第二个版本就改成加进去下载队列,然后一个一个下载。下载完之后使用unzip库进行解压,然后根据从需要下载的队列中移除,记得给线程上锁然后移出或者继续下载,消息就是在curl下载的时候不断发送到Helper的。

DownloaManagerDelegate是中的虚函数,成功、错误、下载中等等提示,在DownloadManager记录着这样一个指针,指向继承DownloadManagerDelegate实现功能的实际子类对象。
准备改进。。。写下载的时候傻逼没有给管理器加一个单例模式。所以就想继承单例模板让DownloadManager自行销毁吧,懒得去管了,考虑一下有没有必要加线程安全呢?>o<...


对了,编译到Android的时候记得使用NDK 4.8。4.6不支持C++11的哦>.<
呀呀呀。。手头还有好多代码。。。求美工,有工资。

浙公网安备 33010602011771号