OkHttp大文件下载

原创 2017年01月03日 22:07:48

系统自带的DownloadManager下载

        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        mReceiver = new Receiver();
        registerReceiver(mReceiver, filter);
    //系统提供的DownloadManager来下载
    private void startDownload() {
        final DownloadManager downloadManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DOWNLOAD_URL));
        request.setDestinationInExternalFilesDir(this, null, "yixin.apk");
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setMimeType("application/vnd.android.package-archive");
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);

        mDownloadId = downloadManager.enqueue(request);
    }
    public class Receiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if (mDownloadId == reference) {
                DownloadManager.Query query = new DownloadManager.Query();
                query.setFilterById(reference);

                Cursor cursor = ((DownloadManager)(getSystemService(
                        Context.DOWNLOAD_SERVICE))).query(query);
                if (cursor.moveToFirst()) {
                    String fileName = cursor.getString(cursor.getColumnIndex(
                            DownloadManager.COLUMN_LOCAL_FILENAME));
                    mTvResult.setText(fileName);
                }
                cursor.close();
            }
        }
    }

使用OkHttp下载

分片下载
    获取文件大小
    分片下载数据
    是否完成
    //OkHttpClient配置
    private OkHttpClient getClient() {
        if (null == mHttpClient) {
            mHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .writeTimeout(30, TimeUnit.SECONDS).build();
        }
        return mHttpClient;
    }
   private static final String DOWNLOAD_URL = "http://yixin.dl.126.net/update/installer/yixin.apk";

    private Button mBtnDownloadSelf;
    private ProgressBar mProgressBar;

    private OkHttpClient mHttpClient;

    private DownloadState mState = DownloadState.PENDING;

    private int mTotal;

    private static final int DELTA = 256 * 1024;

    private OutputStream mDstOutputStream;

    private int mCurrentDownload;

    private enum DownloadState {
        PENDING,
        DOWNLOADING,
        PAUSE,
        DONE
    }
   @Override
    public void onClick(View v) {
        if (R.id.btn_download_by_system == v.getId()) {
//            startDownload();
        } else if (R.id.btn_download_self == v.getId()) {
            switch (mState) {
                case PENDING:
                    startDownloadSelf();
                    mState = DownloadState.DOWNLOADING;
                    break;
                case DOWNLOADING:
                    mState = DownloadState.PAUSE;
                    break;
                case PAUSE:
                    mState = DownloadState.DOWNLOADING;
                    downloadRange(mCurrentDownload);
                    break;
            }
            refreshButton();
        }
    }
    private void refreshButton() {
        switch (mState) {
            case DOWNLOADING:
                mBtnDownloadSelf.setText(R.string.pause);
                break;
            case PENDING:
                mBtnDownloadSelf.setText(R.string.start_download);
                break;
            case PAUSE:
                mBtnDownloadSelf.setText(R.string.resume);
                break;
            case DONE:
                mBtnDownloadSelf.setText(R.string.done);
                break;
        }
    }
    //开始下载
    private void startDownloadSelf() {
        getFileLength(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    //获取下载文件长度
                    mTotal = Integer.valueOf(response.header("Content-Length"));
                    mDstOutputStream = new FileOutputStream(getExternalFilesDir(null).getAbsolutePath() + "/yixin.apk");
                    downloadRange(0);
                }
            }
        });
    }

    //获取文件大小
    private void getFileLength(Callback callback) {
        Request request = new Request.Builder()
                .url(DOWNLOAD_URL)
                .method("HEAD", null).build();

        getClient().newCall(request).enqueue(callback);
    }

    private void downloadRange(int start) {
        //分段下载,range参数将文件进行分片
        Request request = new Request.Builder()
                .url(DOWNLOAD_URL)
                .addHeader("range", "bytes=" + start + "-" + Math.min(start + DELTA, mTotal)).build();

        getClient().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful() && mState == DownloadState.DOWNLOADING) {
                    final byte[] bytes = response.body().bytes();
                    mDstOutputStream.write(bytes);
                    mCurrentDownload += bytes.length;
                    mProgressBar.post(new Runnable() {
                        @Override
                        public void run() {
                            int progress = (int)(mCurrentDownload * 1.0 / mTotal * 100);
                            mProgressBar.setProgress(progress);

                            if (100 == progress) {
                                mState = DownloadState.DONE;
                                refreshButton();
                            }
                        }
                    });

                    if (mCurrentDownload >= mTotal) {
                        mDstOutputStream.flush();
                        mDstOutputStream.close();
                        return;
                    }

                    downloadRange(mCurrentDownload);
                }
            }
        });
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

OKHttp实现大文件的断点续传

本文的亮点: (1)网络请求用OKHttp进行下载大文件 (2)实现了大文件的断点续传 (3)取消下载时,删除已经下载的文件。 实现效果图:          直接给出工程: (1)定义一个接口:D...
  • program_developer
  • program_developer
  • 2017年02月25日 00:02
  • 3705

RxJava+Retrofit+OkHttp深入浅出-终极封装四(多文件下载之断点续传)

Rxjava+ReTrofit+okHttp深入浅出-终极封装三(多文件下载之断点续传)背景断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解...
  • u014610664
  • u014610664
  • 2016年10月24日 14:33
  • 13462

okhttp library

  • 2016年04月29日 13:55
  • 12.12MB
  • 下载

okHttp下载文件

  • 2017年07月02日 21:19
  • 9.63MB
  • 下载

封装了okhttp的网络框架,支持大文件上传下载,上传进度...

本帖最后由 anjoy紫外线 于 2016-4-20 16:42 编辑   1.用法 对于Eclipse不能运行项目的,提供了apk供直接运行,位于项目根目录 okhttputils_v...
  • qq_23174861
  • qq_23174861
  • 2016年05月23日 10:17
  • 6976

okHttp3.0下载文件

okHttp 文件上传:     首先我是通过国内的一位大牛(同时也是我很佩服的一个佼佼者)的博客中总结出自己的一系列的步骤:     第一:当我听到okHttp时,首先想到的是进行在gittub...
  • naying_
  • naying_
  • 2017年04月19日 09:15
  • 1433

Retrofit+OkHttp+Gson+okhttp-urlconnection-2.5.0

  • 2015年11月06日 17:10
  • 649KB
  • 下载

okhttp jar包

  • 2016年04月11日 10:48
  • 419KB
  • 下载

Android OkHttp完全解析 是时候来了解OkHttp了

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47911083; 本文出自:【张鸿洋的博客】 一、概述 最...
  • lmj623565791
  • lmj623565791
  • 2015年08月24日 15:36
  • 605230

[Android开发] 使用okhttp下载文件(带监听)

DownloadManager.javapackage com.minstone.mdoctor.tool.net;import android.os.Handler; import android....
  • niubitianping
  • niubitianping
  • 2016年09月26日 17:50
  • 3777
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OkHttp大文件下载
举报原因:
原因补充:

(最多只允许输入30个字)