Android
来源:互联网 发布:校园网络自助平台 编辑:程序博客网 时间:2024/06/08 09:59
我们的App中常常会涉及到与下载相关的内容,这时候就不得不提及DownloadManager这个类
闲话少说,直接上代码,这里封装成了一个工具类:
1.DownloadUtil.class
package com.mythmayor.download;import android.app.DownloadManager;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.Environment;import android.os.Handler;/** * Created by mythmayor on 2017/4/26. */public class DownloadUtil { private String mUrl; private String mName; private Handler mHandler; private Context mContext; private DownloadManager mManager; private long requestId; public DownloadUtil(Context context, String url, Handler handler, String name) { this.mContext = context; this.mUrl = url; this.mHandler = handler; this.mName = name; //获得DownloadManager对象 mManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); } public long startDownload() { //获得下载id,这是下载任务生成时的唯一id,可通过此id获得下载信息 requestId = mManager.enqueue(CreateRequest(mUrl, mName)); //查询下载信息方法 queryDownloadProgress(requestId, mManager); return requestId; } public int cancelDownload() { return mManager.remove(requestId); } private void queryDownloadProgress(long requestId, DownloadManager downloadManager) { DownloadManager.Query query = new DownloadManager.Query(); //根据任务编号id查询下载任务信息 query.setFilterById(requestId); try { boolean isGoging = true; while (isGoging) { Cursor cursor = downloadManager.query(query); if (cursor != null && cursor.moveToFirst()) { //获得下载状态 int state = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch (state) { case DownloadManager.STATUS_SUCCESSFUL://下载成功 isGoging = false; mHandler.obtainMessage(downloadManager.STATUS_SUCCESSFUL).sendToTarget();//发送到主线程,更新ui break; case DownloadManager.STATUS_FAILED://下载失败 isGoging = false; mHandler.obtainMessage(downloadManager.STATUS_FAILED).sendToTarget();//发送到主线程,更新ui break; case DownloadManager.STATUS_RUNNING://下载中 /** * 计算下载下载率; */ int totalSize = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); int currentSize = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); int progress = (int) (((float) currentSize) / ((float) totalSize) * 100); mHandler.obtainMessage(downloadManager.STATUS_RUNNING, progress).sendToTarget();//发送到主线程,更新ui break; case DownloadManager.STATUS_PAUSED://下载停止 mHandler.obtainMessage(DownloadManager.STATUS_PAUSED).sendToTarget(); break; case DownloadManager.STATUS_PENDING://准备下载 mHandler.obtainMessage(DownloadManager.STATUS_PENDING).sendToTarget(); break; } } if (cursor != null) { cursor.close(); } } } catch (Exception e) { e.printStackTrace(); } } private DownloadManager.Request CreateRequest(String url, String name) { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); //request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);// 隐藏notification request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//显示notification request.setAllowedNetworkTypes(request.NETWORK_WIFI);//设置下载网络环境为wifi request.setDestinationInExternalFilesDir(mContext, Environment.DIRECTORY_DOWNLOADS, name);//指定apk缓存路径,默认是在SD卡中的Download文件夹 return request; }}
2.DownloadUtil的使用
//定义Handler处理下载状态private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case DownloadManager.STATUS_SUCCESSFUL: Toast.makeText(MainActivity.this, "下载任务已经完成!", Toast.LENGTH_SHORT).show(); break; case DownloadManager.STATUS_RUNNING: break; case DownloadManager.STATUS_FAILED: break; case DownloadManager.STATUS_PENDING: break; } } };private DownloadUtil mUtil;mUtil = new DownloadUtil(MainActivity.this, url, handler, fileName);//开始下载new Thread() { @Override public void run() { long l = mUtil.startDownload(); ToastUtil.showToast(MainActivity.this, "requestId = " + l); }}.start();//取消下载int i = mUtil.cancelDownload();if (i == 1) { ToastUtil.showToast(this, "下载已取消 ");}
最后附上源码下载地址
点击此处进入源码下载界面
阅读全文
0 0
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- HBuilder控制台集成命令提示符(终端/CMD)功能
- ospfj
- Mac使用mysql中出现ERROR 1045: Access denied for user: 'root@localhost' 以及密码过期解决方法
- 【Java面试】java基础篇
- QImage
- Android
- 发送有序广播
- 详解 JVM 工作原理和流程
- JAVA高级工程师课程笔记整理——(十)Servlet
- 简单NIm
- 双管道与cmd.exe进程间通信演示
- android App异常报错捕获后使用javamail登录QQ邮箱发邮件的功能遇到的问题
- Hibernate hql语句 find_in_set 用法
- hadoop相关ERROR