[Android开发] 使用okhttp下载文件(带监听)
2016-09-26 17:50
716 查看
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) { //进度返回 } }
相关文章推荐
- Android OkHttp文件上传与下载的进度监听扩展
- android 开发中使用okhttp上传文件到服务器
- android使用OkHttp实现下载的进度监听和断点续传
- Android开发中,使用线程下载apk文件,出现FileNotFound的问题,解决办法
- android开发(23)使用DownloadManager下载文件
- Android OkHttp文件上传与下载的进度监听扩展
- [置顶] Android使用okhttp封装多文件批量下载 (带进度条,取消下载)
- Android OkHttp文件上传与下载的进度监听扩展
- 使用Android的OkHttp包实现基于HTTP协议的文件上传下载
- android开发步步为营之67:使用android开源项目android-async-http异步下载文件
- android开发(23)使用DownloadManager下载文件
- Android OkHttp文件上传与下载的进度监听扩展
- android开发(23)使用DownloadManager下载文件
- 使用Android内部的DownloadProvider下载文件,并获取cache权限
- mars老师[Android开发视频教学].01_18 文件下载 源码
- Android开发进阶(五)--使用原始的XML文件
- 读懂Android (1):使用Android内部的DownloadProvider下载文件,并获取cache权限
- Android2.3.3系统开发一个在线OTA功能下载文件功能
- Android 开发(三)使用Stirngs资源文件的技巧
- android 开发之文件下载