Android自家使用了Volley來處理輕量級的網(wǎng)絡(luò)請求啊掏,但是不建議用來處理下載大文件熬芜,在尋求如何下載大數(shù)據(jù)的時(shí)候缕贡,Android官方給出了一個(gè)建議参淫,使用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來下載
我不想詳細(xì)列出它有哪些方法,哪些參數(shù)可供開發(fā)人員使用黄刚,因?yàn)槲蚁M惆炎⒁饬Ψ旁贒ownloadManager是如何開始下載的。首先假設(shè)我們需要下載一個(gè)apk來更新應(yīng)用的版本民效,那么來看一下如何使用DownloadManager來處理的:
// uri 是你的下載地址憔维,可以使用Uri.parse("http://")包裝成Uri對象
DownloadManager.Request req = new DownloadManager.Request(uri);
// 通過setAllowedNetworkTypes方法可以設(shè)置允許在何種網(wǎng)絡(luò)下下載,
// 也可以使用setAllowedOverRoaming方法畏邢,它更加靈活
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
// 此方法表示在下載過程中通知欄會(huì)一直顯示該下載业扒,在下載完成后仍然會(huì)顯示,
// 直到用戶點(diǎn)擊該通知或者消除該通知舒萎。還有其他參數(shù)可供選擇
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// 設(shè)置下載文件存放的路徑程储,同樣你可以選擇以下方法存放在你想要的位置。
// setDestinationUri
// setDestinationInExternalPublicDir
req.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, title);
// 設(shè)置一些基本顯示信息
req.setTitle("Android.apk");
req.setDescription("下載完后請點(diǎn)擊打開");
req.setMimeType("application/vnd.android.package-archive");
// Ok go!
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long downloadId = dm.enqueue(req);
這樣我們就開始下載了臂寝。至于斷點(diǎn)續(xù)傳章鲤、在什么網(wǎng)絡(luò)環(huán)境下下載,系統(tǒng)已經(jīng)按我們想要的方式來運(yùn)行咆贬,我們并不需要擔(dān)心這些败徊。
獲取下載文件
看到上面代碼的最后一行返回的參數(shù)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();
}
獲取下載的狀態(tài)
有時(shí)候我們不想重復(fù)下載同一個(gè)文件皱蹦,或者出于某種原因,我們需要查詢下載的狀態(tài)眷蜈,以便于更新界面等操作沪哺,那么我們來看看如何獲取下載的狀態(tài)的:
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();
}
每個(gè)方法都如其名,不在贅述酌儒。
最后
斷點(diǎn)續(xù)傳辜妓?交給系統(tǒng)處理吧。