Android自家使用了Volley来处理轻量级的网络请求,但是不建议用来处理下载大文件,在寻求如何下载大数据的时候,Android官方给出了一个建议,使用DownloadManager来处理。

Volley is not suitable for large download or streaming operations, since Volley holds all responses in memory during parsing. For large download operations, consider using an alternative like DownloadManager.

使用DownloadManager来下载

我不想详细列出它有哪些方法,哪些参数可供开发人员使用,因为我希望你把注意力放在DownloadManager是如何开始下载的。首先假设我们需要下载一个apk来更新应用的版本,那么来看一下如何使用DownloadManager来处理的:

// uri 是你的下载地址,可以使用Uri.parse("http://")包装成Uri对象DownloadManager.Request req = new DownloadManager.Request(uri);// 通过setAllowedNetworkTypes方法可以设置允许在何种网络下下载,// 也可以使用setAllowedOverRoaming方法,它更加灵活req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);// 此方法表示在下载过程中通知栏会一直显示该下载,在下载完成后仍然会显示,// 直到用户点击该通知或者消除该通知。还有其他参数可供选择req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);// 设置下载文件存放的路径,同样你可以选择以下方法存放在你想要的位置。// setDestinationUri// setDestinationInExternalPublicDirreq.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, title);// 设置一些基本显示信息req.setTitle("Android.apk");req.setDescription("下载完后请点击打开");req.setMimeType("application/vnd.android.package-archive");// Ok go!DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);long downloadId = dm.enqueue(req);

这样我们就开始下载了。至于断点续传、在什么网络环境下下载,系统已经按我们想要的方式来运行,我们并不需要担心这些。

获取下载文件

看到上面代码的最后一行返回的参数downloadId了吗?对,我们需要利用它来找出我们刚刚下载的文件:

DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);Cursor c = dm.query(query);if (c != null) {    if (c.moveToFirst()) {        String fileUri = c.getString(c.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));        // TODO 你可以在这里处理你的文件    }    c.close();}

获取下载的状态

有时候我们不想重复下载同一个文件,或者出于某种原因,我们需要查询下载的状态,以便于更新界面等操作,那么我们来看看如何获取下载的状态的:

DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);Cursor c = dm.query(query);if (c != null && c.moveToFirst()) {    int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));    switch (status) {        case DownloadManager.STATUS_PENDING:            break;        case DownloadManager.STATUS_PAUSED:            break;        case DownloadManager.STATUS_RUNNING:            break;        case DownloadManager.STATUS_SUCCESSFUL:            break;        case DownloadManager.STATUS_FAILED:            break;}if (c != null) {    c.close();}

每个方法都如其名,不在赘述。

最后

断点续传?交给系统处理吧。

转载请附上本文地址

更多相关文章

  1. Android屏幕旋转时Activity不重新调用onCreate的方法
  2. Android Studio中隐藏状态栏和标题栏的方法
  3. 根据文件名称修改安卓默认的蓝牙接收文件地址
  4. 赵雅智_AndroidManifest.xml配置文件详解
  5. android软键盘弹出,会把原来的界面挤上去的问题 处理方法
  6. 通过xml布局文件实现按钮改变焦点设置背景图片

随机推荐

  1. . io .IOException:setDataSource失败了
  2. Android图形图像处理之Bitmap和BitmapFac
  3. android里Toast的用法
  4. 无法向CalendarView事件添加侦听器
  5. 实现基于注解(Annotation)的数据库框架(一)反
  6. Android内容提供者——Content Providers
  7. OpenCV4Android中图像预览旋转90度的问题
  8. 如何将本机应用程序(android)与phonegap应
  9. 【Android学习】数据传递三种方式
  10. 说说Android的广播(4) - 前台广播为什么