0

我试着在我的主线程中同步下载一些文件。 此外,我创建了一个递归方法,它在每个接收回调(使用progressdialog递增)时调用自己,但在200/250递归调用后,我有一个堆栈溢出错误。看起来这不是最佳做法。 之后,我尝试了一个简单的for循环,但是下载并没有在每个循环之间完成,所以unregisterReceiver没有调用,这导致泄漏。同步下载文件的最佳方式(downloadManager)

这是我的循环代码:

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(); 
} 

很抱歉,如果我的英语不好^^”

+0

你不应该在主线程下载文件,为什么不使用异步任务 –

回答

0

你不必尽快下载完成后注销您的广播接收器。在应用程序从视图中删除之前,只需要清理它。正因为如此,通常情况下最好的做法是在您的Activity的onPause()方法中取消注册您的接收器,以便在应用程序移至背景或完成完成时简单地进行清理。

至于下载过程中的进度更新,DownloadManager有一个自动显示,用于显示下载进度。你只需要调用request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

如果你想实现自己的进度界面,您可以查询您的下载存储在DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR,然后取消您的UI元素的DownloadManager内部字节计数时,您将收到通知你的广播接收器DownloadManager.ACTION_DOWNLOAD_COMPLETE

正如你所看到的,有很多方法可以做你想做的事情。这听起来像你需要在DownloadManager文档上多读一些,以便充分利用类提供的便利。

相关问题