我有一个可下载多个文件的下载管理器。如何在经理启动第一个请求时显示进度对话框,并在最后一个请求完成下载后关闭对话框?
我猜我需要使用ACTION_DOWNLOAD_COMPLETE进行检查,但我不知道如何实现它。谢谢你的帮助。
答案 0 :(得分:4)
这是我编写的一些实用程序代码,用于使用DownloadManager执行下载并将结果传递给回调
public static void downloadPdf(Context context, String url, String name, final Callback callback){
Uri uri;
try{
uri = Uri.parse(url);
}
catch(Exception e){
Log.e(LogTags.UI, "Error parsing pdf url " + url, e);
callback.onError();
return;
}
DownloadManager.Request r = new DownloadManager.Request(uri);
// This put the download in the same Download dir the browser uses
r.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, name);
// When downloading music and videos they will be listed in the player
// (Seems to be available since Honeycomb only)
r.allowScanningByMediaScanner();
// Notify user when download is completed
// (Seems to be available since Honeycomb only)
r.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
// Start download
final DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = dm.enqueue(r);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
if(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0) != downloadId){
// Quick exit - its not our download!
return;
}
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(downloadId);
Cursor c = dm.query(query);
if (c.moveToFirst()) {
int columnIndex = c
.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c
.getInt(columnIndex)) {
String uriString = c
.getString(c
.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
Uri uri = Uri.parse(uriString);
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/pdf");
callback.onSuccess();
context.startActivity(intent);
}
else{
callback.onError();
}
}
else{
callback.onError();
}
context.unregisterReceiver(this);
}
}
};
context.registerReceiver(receiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
你可以在回调中执行你想要的任何UI工作 - 在我的情况下,我在开始下载之前启动一个不确定的进度对话框,然后在完成后隐藏它:
String filename = "Some Notes.pdf";
final ProgressDialog dialog = ProgressDialog.show(this,
"Downloading PDF",
"Donwloading " + filename, true, true);
downloadPdf(this,
"http://some-url.com/with_pdf.pdf",
filename,
new Callback() {
@Override
public void onSuccess() {
dialog.dismiss();
}
@Override
public void onError() {
dialog.dismiss();
}
});
PS。我使用了有用的Picasso库中的Callback接口 - 您可以轻松定义自己的,它只有两个onSuccess和onError方法。