【发布时间】:2016-03-06 18:01:38
【问题描述】:
我尝试在我的主线程中同步下载一些文件。 此外,我创建了一个递归方法,该方法在每次接收回调时调用自身(使用progressdialog 增量),但是在200/250 次递归调用之后,我遇到了堆栈溢出错误。这似乎不是最好的做法。 之后,我尝试了一个简单的 for 循环,但每个循环之间的下载都没有完成,所以 unregisterReceiver 没有被调用,这会造成泄漏。
这是我的循环代码:
private void loadMediaFiles(final ArrayList<MediaAPIModel> mediaAPIModels, final ProgressDialog progressDialog) {
for(int i = 0; i < mediaAPIModels.size(); i++) {
if (mediaAPIModels.get(i).getUrl() != null) {
if (!FileManager.getInstance().getFileFromLocal(context, mediaAPIModels.get(i).getUrl(), false)) {
String name = mediaAPIModels.get(i).getUrl().substring(mediaAPIModels.get(i).getUrl().lastIndexOf("/") + 1); //on s?pare le nom du fichier du reste de l'url
Log.d(TAG, CallAPI.mBaseUrl + mediaAPIModels.get(i).getUrl());
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(CallAPI.mBaseUrl + mediaAPIModels.get(i).getUrl()));
request.setDescription(context.getResources().getString(R.string.downloading) + " name");
request.setTitle(context.getResources().getString(R.string.app_name));
request.setMimeType(name.substring(name.lastIndexOf(".")));
// in order for this if to run, you must use the android 3.2 to compile your app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
request.setDestinationInExternalPublicDir("test" + File.separatorChar + "doc", name);
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
context.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
context.unregisterReceiver(this);
progressDialog.setProgress(progressDialog.getProgress() + 1);
}
}, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
} else {
Log.d(TAG, "doc already exists");
progressDialog.setProgress(progressDialog.getProgress() + 1);
}
} else {
Log.d(TAG, "finish");
progressDialog.setProgress(progressDialog.getProgress() + 1);
}
}
if (progressDialog.isShowing())
progressDialog.dismiss();
startProcess();
}
对不起,如果我的英语不好^^'
【问题讨论】:
-
你不应该在主线程上下载文件,为什么不使用异步任务
标签: android recursion stack-overflow synchronous android-download-manager