今天在这篇博客里面,我想说说自己在这几天遇到的一个棘手的问题,就是视频断点续传的问题。其实这在我们开发中是一个很常见的应用场景,比如视频、音频、pdf等相关的文档。如果之前没有接触过的话,你也许会被这个问题给吓到,也许会有一种找不到北的感觉,但是如果你了解其中的原理的话,就会觉得很简单。
让我们先来讲讲视频断点续传的原理吧,当我们需要将文件存储到磁盘空间里面的时候,最总的存储格式肯定是二进制字节。这样的话,我们在存储文件字节的同时记录下当前文件字节的长度,已经存储的文件字节长度。这样的话,我们不仅可以做到断点续传,还可以做到同时开启多个线程进行文件的下载。是不是听起来有点小激动呢?但是代码又应该怎么写呢?详情请参见这篇博客,这里就不再重复造轮子了。
我还想给大家分享一款断点续传非常实用的框架Afinal,先来看看Afinal的优势:Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少。在android应用开发中,通过Afinal的ioc框架,诸如ui绑定,事件绑定,通过注解可以自动绑定。通过Afinal的orm框架,无需任何配置信息,一行代码就可以对android的sqlite数据库进行增删改查操作。同时,Afinal内嵌了finalHttp等简单易用的工具,可以轻松的对http就行求情的操作。Afinal的宗旨是简洁,快速。约定大于配置的方式。尽量一行代码完成所有事情。看到上面这段话的描述你也许会想说:orm和ioc框架到底是什么鬼?如果你接触过一定的java web开发的话,一定就了解spring mvc框架吧,在spring框架里面,就应用到orm和ioc。orm指定的就是元数据映射,,说白了就是将xml里面定义好的一些标签映射到对象里面去;而ioc呢?学术一点的说法就是”依赖注入“,就是将你需要的一些通用/可框架化的代码注入到你所希望的位置。
由于在这篇博客里面,我们主要应用它的断点续传功能,所以下面就让我们来看看实现代码吧:
FinalHttp fh = new FinalHttp();
fh.download("http://www.xxx.com/下载路径/xxx.apk", "/mnt/sdcard/testapk.apk", new AjaxCallBack() {
@Override
public void onLoading(long count, long current) {
textView.setText("下载进度:"+current+"/"+count);
} @Override
public void onSuccess(File t) {
textView.setText(t==null?"null":t.getAbsoluteFile().toString());
} });
通过上面的代码分析我们可以看出其实很简单吧,我们只需要在onLoading方法里面实时更新进度,然后在onSuccess方法里面执行你想要的UI展示操作就可以了。更加详细的介绍,可以参见如下两篇博客:Android开源框架Afinal第二篇——庖丁解牛,深入调查和开源项目之Android Afinal框架;