使用okHttp下载文件

2人阅读 评论(0) 收藏 举报

项目中使用到了文本文件下载的功能,该功能的实现可以使用okHttp来实现,结合项目的需求,代码如下:

public class DownfileUtils {
    private static OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10000, TimeUnit.MILLISECONDS)
            .readTimeout(10000, TimeUnit.MILLISECONDS)
            .writeTimeout(10000, TimeUnit.MILLISECONDS).build();
    private static String basePath = Environment.getExternalStorageDirectory().getAbsolutePath()
            + "/xxxx/xxxx" + "/xxxx/xxxx";//文件路径
    private static String filePath;

    //下载文件方法
    public static void downloadFile(String url, final ProgressListener listener, Callback callback) {
        //增加拦截器
        OkHttpClient client = okHttpClient.newBuilder().addNetworkInterceptor(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());
                return response.newBuilder().body(new ProgressResponseBody(response.body(), listener)).build();
            }
        }).build();

        Request request = new Request.Builder().url(url).build();
        client.newCall(request).enqueue(callback);
    }

    /**
     * 下载文件
     */
    public static void downReplyFile(String url, final ProgressBar progressBar, final String filename) {
        DownfileUtils.downloadFile(url, new ProgressListener() {
            @Override
            public void onProgress(long currentBytes, long contentLength, boolean done) {
                int progress = (int) (currentBytes * 100 / contentLength);
                progressBar.setProgress(progress);//下载进度条
                if (progress / 5 > 0) {
                    progressBar.setVisibility(View.VISIBLE);
                    progressBar.setProgress(progress);
                }
                if (progress == 100) {
                    progressBar.setVisibility(View.GONE);
                }
            }
        }, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response != null) {
                    File file = new File(basePath);
                    if (!file.exists()) {
                        file.mkdir();
                    }
                    InputStream is = response.body().byteStream();
                    filePath = basePath + "/" + filename;
                    File downfile = new File(filePath);
                    if (downfile.isFile() && downfile.exists()) { //判断文件是否存在----存在则不处理
                    } else {
                        FileOutputStream fos = new FileOutputStream(downfile);//写文件
                        int len = 0;
                        byte[] buffer = new byte[2048];
                        while (-1 != (len = is.read(buffer))) {
                            fos.write(buffer, 0, len);
                        }
                        fos.flush();
                        fos.close();
                        is.close();
                    }

                }
            }
        });
    }

    public static String getBasePath() {
        return basePath;
    }
}

定义进度条的接口

public interface ProgressListener {
    //已完成的 总的文件长度 是否完成
    void onProgress(long currentBytes, long contentLength, boolean done);
}

请求响应类

public class ProgressResponseBody extends ResponseBody {
    public static final int UPDATE = 0x01;
    public static final String TAG = ProgressResponseBody.class.getName();
    private ResponseBody responseBody;
    private ProgressListener mListener;
    private BufferedSource bufferedSource;
    private Handler myHandler;

    public ProgressResponseBody(ResponseBody body, ProgressListener listener) {
        responseBody = body;
        mListener = listener;
        if (myHandler == null) {
            myHandler = new MyHandler();
        }
    }

    /**
     * 将进度放到主线程中显示
     */
    class MyHandler extends Handler {

        public MyHandler() {
            super(Looper.getMainLooper());
        }

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE:
                    ProgressModel progressModel = (ProgressModel) msg.obj;
                    //接口返回
                    if (mListener != null)
                        mListener.onProgress(progressModel.getCurrentBytes(), progressModel.getContentLength(), progressModel.isDone());
                    break;

            }
        }
    }

    @Override
    public MediaType contentType() {
        return responseBody.contentType();
    }

    @Override
    public long contentLength() {
        return responseBody.contentLength();
    }

    @Override
    public BufferedSource source() {

        if (bufferedSource == null) {
            bufferedSource = Okio.buffer(mySource(responseBody.source()));
        }
        return bufferedSource;
    }

    private Source mySource(Source source) {

        return new ForwardingSource(source) {
            long totalBytesRead = 0L;

            @Override
            public long read(Buffer sink, long byteCount) throws IOException {
                long bytesRead = super.read(sink, byteCount);
                totalBytesRead += bytesRead != -1 ? bytesRead : 0;
                //发送消息到主线程,ProgressModel为自定义实体类
                Message msg = Message.obtain();
                msg.what = UPDATE;
                msg.obj = new ProgressModel(totalBytesRead, contentLength(), totalBytesRead == contentLength());
                myHandler.sendMessage(msg);

                return bytesRead;
            }
        };
    }
}
至此,下载功能代码展示完毕。


查看评论

Android_Okhttp上传与下载文件

一:使用okhttp下载与上传文件 依赖 compile 'com.squareup.okhttp3:okhttp:3.9.1' compile 'com.google.code.gson:gson:...
  • Android___vv
  • Android___vv
  • 2017-12-25 13:38:45
  • 392

OkHttp 下载文件实现

OkHttp 下载文件实现 public static boolean DownloadFile(final String uri, final String filePath) { ...
  • flaming999
  • flaming999
  • 2017-01-13 12:44:52
  • 534

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

DownloadManager.javapackage com.minstone.mdoctor.tool.net;import android.os.Handler; import android....
  • niubitianping
  • niubitianping
  • 2016-09-26 17:50:45
  • 4615

OkHttp 使用 封装 包括上传下载进度显示

  • 2015年09月10日 11:27
  • 6.54MB
  • 下载

okHttp3.0下载文件

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

okhttp实现文件下载

  • 2017年07月22日 08:55
  • 21.94MB
  • 下载

OkHttp下载文件并使用服务器返回的文件名字

开发中有这么个场景,Android端下载文件,文件名字大多数都由我们app端定义,假如说,产品说,为了不让我们客户端写死,可以直接使用服务器返回的文件名字.好那么我们今天来研究一下 看下效果 ...
  • EaskShark
  • EaskShark
  • 2018-01-27 14:41:10
  • 545

OkHttp下载文件并带进度条

做这一行,不能太懒,不然就被淘汰! OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件并带进度条!相关资料: ...
  • Gary__123456
  • Gary__123456
  • 2017-07-02 21:23:03
  • 2523

Android okHttp文件下载并带进度条的demo(简单工具类)

根据okHttp简单的封装了一个根据url下载文件并更新进度的工具类,在此记录下,以后要使用可以进行参考 先来看看效果图: 接下来看看具体的代码实现 首先在:app中添加项目对于Okhttp的依赖...
  • lplj717
  • lplj717
  • 2017-10-16 16:10:18
  • 676

Android okHttp网络请求之文件上传下载

Android okHttp网络请求之文件上传下载 http://www.cnblogs.com/whoislcj/p/5529827.html 前言:    前面介绍了基于okHttp...
  • lsw8569013
  • lsw8569013
  • 2016-10-19 10:28:46
  • 2268
    个人资料
    等级:
    访问量: 281
    积分: 34
    排名: 193万+
    文章分类
    文章存档