這幾天由於公司項目需要,學習了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的會運行報錯