[Android开发] 使用okhttp下载文件(带监听)
来源:互联网 发布:太极集团知乎 编辑:程序博客网 时间:2024/05/21 11:17
DownloadManager.java
package com.minstone.mdoctor.tool.net;import android.os.Handler;import android.os.Looper;import com.minstone.util.LogUtil;import com.squareup.okhttp.Call;import com.squareup.okhttp.Callback;import com.squareup.okhttp.OkHttpClient;import com.squareup.okhttp.Request;import com.squareup.okhttp.Response;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import static com.minstone.util.FileAccessor.getFileName;/** * Created by LITP on 2016/9/26. */public class DownloadManager { public DownloadManager() { mDelivery = new Handler(Looper.getMainLooper()); } private Handler mDelivery; //主线程返回 private Call downCall; //下载的call private static OkHttpClient mOkHttpClient; private static DownloadManager mInstance; //单例 public static DownloadManager getInstance() { if (mInstance == null) { synchronized (OkHttpManager.class) { if (mInstance == null) { mInstance = new DownloadManager(); } } } return mInstance; } //synchronized修饰的静态方法锁定的是这个类的所有对象,保证在同一时刻最多只有一个线程执行该段代码 public synchronized OkHttpClient getOkHttpClient() { if (null == mOkHttpClient) { try { mOkHttpClient = newOkHttpClient(); } catch (Exception e) { e.printStackTrace(); } } return mOkHttpClient; } /** * 创建okhttp * * @return * @throws Exception */ private OkHttpClient newOkHttpClient() throws Exception { //创建okHttpClient对象 OkHttpClient mOkHttpClient = new OkHttpClient(); TrustManager tm = new OkHttpManager.myTrustManager(); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{tm}, null); mOkHttpClient.setSslSocketFactory(sslContext.getSocketFactory()); return mOkHttpClient; } /** * 异步下载文件 * * @param url 文件的下载地址 * @param destFileDir 本地文件存储的文件夹 * @param callback */ private void okHttpDownload(final String url, final String destFileDir, final ResultCallback callback) { final Request request = new Request.Builder() .url(url) .build(); downCall = getOkHttpClient().newCall(request); downCall.enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { sendFailedStringCallback(request, e, callback); } @Override public void onResponse(Response response) { InputStream is = null; byte[] buf = new byte[2048]; int len = 0; FileOutputStream fos = null; try { double current = 0; double total = response.body().contentLength(); is = response.body().byteStream(); File file = new File(destFileDir, getFileName(url)); fos = new FileOutputStream(file); while ((len = is.read(buf)) != -1) { current += len; fos.write(buf, 0, len); LogUtil.w("download current------>" + current); sendProgressCallBack(total, current, callback); } fos.flush(); //如果下载文件成功,第一个参数为文件的绝对路径 sendSuccessResultCallback(file.getAbsolutePath(), callback); } catch (IOException e) { sendFailedStringCallback(response.request(), e, callback); } finally { try { if (is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }); } //下载失败ui线程回调 private void sendFailedStringCallback(final Request request, final Exception e, final ResultCallback callback) { mDelivery.post(new Runnable() { @Override public void run() { if (callback != null) callback.onError(request, e); } }); } //下载成功ui线程回调 private void sendSuccessResultCallback(final Object object, final ResultCallback callback) { mDelivery.post(new Runnable() { @Override public void run() { if (callback != null) { callback.onResponse(object); } } }); } //下载回调接口 public static abstract class ResultCallback<T> { //下载错误 public abstract void onError(Request request, Exception e); //下载成功 public abstract void onResponse(T response); //下载进度 public abstract void onProgress(double total, double current); } /** * 进度信息ui线程回调 * * @param total 总计大小 * @param current 当前进度 * @param callBack * @param <T> */ private <T> void sendProgressCallBack(final double total, final double current, final ResultCallback<T> callBack) { mDelivery.post(new Runnable() { @Override public void run() { if (callBack != null) { callBack.onProgress(total, current); } } }); } /* 下面为对外开放接口 */ /** * 下载文件 * * @param url 文件链接 * @param destDir 下载保存地址 * @param callback 回调 */ public static void downloadFile(String url, String destDir, ResultCallback callback) { getInstance().okHttpDownload(url, destDir, callback); } /** * 取消下载 */ public static void cancleDown(){ getInstance().downCall.cancel(); }}
使用:
private void startDown(){ String apkUrl = "apk下载的链接"; String fileUrl = Environment.getExternalStorageDirectory().getAbsolutePath(); DownloadManager.downloadFile(apkUrl,fileUrl,new DownloadCallBack()); } //监听类 class DownloadCallBack extends DownloadManager.ResultCallback { @Override public void onError(Request request, Exception e) { //下载失败返回 } @Override public void onResponse(Object response) { //下载成功返回 } @Override public void onProgress(double total, double current) { //进度返回 } }
0 0
- [Android开发] 使用okhttp下载文件(带监听)
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Android OkHttp文件上传与下载的进度监听扩展
- Retrofit(二)、使用Retrofit+OkHttp下载文件并带进度条
- OkHttp下载文件并带进度条
- Android使用okhttp封装多文件批量下载 (带进度条,取消下载)
- Android使用okhttp下载图片
- 使用Android自带DownloadManager下载文件
- 使用Android自带DownloadManager下载文件
- 使用Android自带DownloadManager下载文件
- 使用Android自带DownloadManager下载文件
- 使用Android自带DownloadManager下载文件
- Android okHttp文件下载并带进度条的demo(简单工具类)
- 使用OkHttp实现下载的进度监听和断点续传
- Android OkHttp 文件上传和下载
- java程序里实现ssh, scp, sftp
- 追忆似水童年
- 在Java中如何遍历Map对象
- 每个人应该知道的NVelocity用法
- 非递归创建二叉树&非递归访问二叉树
- [Android开发] 使用okhttp下载文件(带监听)
- lca Tarjan学习笔记
- 用快捷键和提示来提高你用 Sublime Text 的生产力
- servlet2016
- Android混淆笔记
- stm8l051的外部中断
- ADB server didn't ACK
- 代码无弹窗判断设备是否root
- Java点滴:Map与String的转换公共方法