利用Xutils框架进行断点续传下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qiang_xi/article/details/50663593

前面有两篇博文主要介绍了如何利用volley获取所有cookie信息和自定义一个request,

地址如下:

Volley 添加Cookie和获取服务器返回的一条或多条Cookie

继承Volley的Request,创造自己的Request,实现cookie回调和指定返回数据类型回调

我们都知道volley是google官方推出的一款网络请求框架,它适合高并发但是数据量不大的网络请求操作,利用volley我们可以非常迅速的连接到服务器拿到我们的json返回值,在加载图片方面,volley提供了imageRequest和imageLoader以及netWorkImageView控件来帮助我们便捷迅速的加载图片,且使用networkImageView时不用担心图片加载错位的问题,但是在实际需求中,我们进行的网络请求操作却不止获取json数据和加载图片,我们往往还要上传文件到服务器,或者从服务器下载文件等操作,而这些需求却是volley的短板,即使用volley很难做到上传下载的操作.当然我们可以自己写原生代码来满足volley的不足,但是这样过于麻烦,毕竟重复造轮子也是不可取的,我们需要一个框架来帮助我们完成这件事,这里我采用xUtils框架,当然可以满足上传下载需求的框架还有很多,如afinal框架,asyncHttpClient框架,andBase框架等等,这些框架大都差不多,我比较一下各自的优缺点决定还是选择xUtils框架,原因也很简单,相比于afinal框架,xUtils框架功能更加全面,而asyncHttpClient框架对于android6.0的兼容不是太好(毕竟要为将来考虑嘛),对于andBase框架,只能说这个框架包含的东西太多了,不止是网络方面的,还有很多view效果,导致该框架的体积较大,而xUtils框架的jar包才277k,就算是library文件也才554k,所以综合起来看,xUtils框架还是很不错的哈!!!

xUtils进行断点续传下载

ok,进入正题,对于Xutils的断点续传下载,可能有一部分人只是知道这个框架可以做这件事,但是却不知道如何在代码中实现,在github上,作者的说明也很少,即使看过作者的sample之后,还是感觉实现起来很有难度的样子,其实作者代码里已经帮我们做好了数据库的创建,进度的记录等操作,我们需要做的就只是调用httpUtil的download方法即可,既然是断点续传,肯定少不了暂停下载和继续下载,做到这一点也很简单,只需要设置一个flag即可,具体的代码如下,注释的很详细:

package com.example.administrator.xutilsdemo;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.HttpHandler;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private TextView progress_tv;
    private String path;
    private String url = "http://111.11.184.105/shouji.360tpcdn.com/160201/1d9480001dcfe0c1bdd673688ecf4ac4/com.baidu.BaiduMap_725.apk";
    private boolean isDownloading = false;
    private HttpHandler<File> handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_main);

        progress_tv = (TextView) findViewById(R.id.progress_tv);
        path = Environment.getExternalStorageDirectory().getPath() + "/com.baidu.BaiduMap_725.apk";

    }


    public void click(View view) {
        xUtils_Download();
    }

    /**
     * 利用xUtils进行断点续传下载
     */
    private void xUtils_Download() {
        HttpUtils httpUtils = new HttpUtils();
        //没有下载时点击,进行下载
        if (!isDownloading) {
            isDownloading = true;
            //第一个参数:下载地址
            //第二个参数:文件存储路径
            //第三个参数:是否断点续传
            //第四个参数:是否重命名
            //第五个参数:请求回调
            handler = httpUtils.download(url, path, true, true, new RequestCallBack<File>() {
                @Override
                public void onStart() {
                    super.onStart();
                    progress_tv.setText("开始下载...");
                }

                @Override
                public void onLoading(long total, long current, boolean isUploading) {
                    super.onLoading(total, current, isUploading);
                    progress_tv.setText(current + "/" + total);
                }

                @Override
                public void onSuccess(ResponseInfo<File> responseInfo) {
                    progress_tv.setText("下载完成-->" + responseInfo.result.getPath());
                }

                @Override
                public void onFailure(HttpException e, String s) {
                    progress_tv.setText("下载失败-->" + s);
                }
            });
        } 
        //正在下载时点击,则停止下载
        else {
            handler.cancel();
            isDownloading = false;
        }

    }

}

代码很简单,只是调用的httputil的download方法,同时把第三个和第四个参数都设置为true即可实现断点续传下载操作,至于创建数据库和记录下载的进度等操作都已经在框架里实现好了,完全不用我们操心,如果想增加或减少下载文件时的线程数量,可以在HttpUtils初始化完毕后,添加如下代码:
 httpUtils.configRequestThreadPoolSize(5);//设置由几条线程进行下载
并且xUtils框架的断点续传下载支持后台下载,即把应用切换到后台后,一样会继续下载,但是xUtils还是有一个不足,就是不支持多任务下载,如果已经有一个任务正在下载,当点击其他的下载按钮时,会暂停正在进行的下载,然后开始自己的下载,也就是说,xUtils一次只能下载一个任务.

效果图:
















阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页