android DownloadManager 的学习之路

    这几天由于公司项目需要,学习了DownloadManager下载管理器。由于公司自己写的下载类下载速度太慢,尽管使用了多线程下载,但是下载速度不尽人意。后来自己写了一个demo,使用了android自带的下载管理器DownloadManager.使用DownloadManager很简单的几行代码就搞定了。如下代码所示:


  String serviceString = Context.DOWNLOAD_SERVICE; 
        DownloadManager downloadManager; 
        downloadManager = (DownloadManager)getSystemService(serviceString); 
         
        Uri uri = Uri.parse("http://au.apk.umeng.com/uploads/apps/56f52012e0f55ad7c9001efc/_umeng_%40_20_%40_b721620b58c141c9dddd8c50c4a21c52.apk"); 
        DownloadManager.Request request = new Request(uri); 
        
        File saveFile = new File(Environment.getExternalStorageDirectory()+"/download.apk");
        
        request.setDestinationUri(Uri.fromFile(saveFile));
        request.setAllowedNetworkTypes(Request.NETWORK_WIFI); 
        request.setTitle("下载demo");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        mReference = downloadManager.enqueue(request); 


如果需要侦听下载进度,或者获取其他下载信息,可根据以下代码来实现:

   int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));  //根据downloadManager.enqueue(request)返回的下载ID,从数据库查询下载状态。
  int reasonIdx = c.getColumnIndex(DownloadManager.COLUMN_REASON);    
  int titleIdx = c.getColumnIndex(DownloadManager.COLUMN_TITLE);    //查询下载标题 就是你setTitle的字符串
   int fileSizeIdx = c.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES);    / /  文件的总长度
   int bytesDLIdx =  c.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR);    //以下载的长度
   String title = c.getString(titleIdx);    
   int fileSize = c.getInt(fileSizeIdx);    
   int bytesDL = c.getInt(bytesDLIdx);    


   下载进度就是bytesDL / fileSize 。


可以根据自己的需要,设置是否需要在通知栏显示下载进度,也可以注册广播,侦听下载进度,和下载是否完成。


DownlaodManager的下载速度还是很快的,自此下载demo完成

这几天一直在测试下载的性能,在测试过程中发现一个问题。那就是DownloadManager 下载文件路径不能是app的私有目录。会报错。所以下载路径只能是Sd卡目录

另外一个,DownloadManager是在2.3系统之后才支持,低于2.3的会运行报错



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章