同时下载文件 - 处理它的最佳方法

时间:2011-05-14 02:50:21

标签: android

我正在编写针对API级别9或更高级别的应用程序。所以我 已经决定使用SDK提供的DownloadManager类。 我的问题是2部分 - 1.当我下载单个文件时,如何显示进度 的下载。我看到我可以得到COLUMN_TOTAL_SIZE_BYTES和 查询下载管理器的COLUMN_BYTES_DOWNLOADED_SO_FAR 实例。但我不确定我是否必须将查询放在一个线程中 实现循环,以便我可以定期轮询以更新进度 酒吧。我想,我不确定,如何定期查询 - 它会进去 主线程或实现为runnable - 我的机制 不清楚。 2.如果我必须支持多个文件下载,那么我必须这样做 在它自己的线程中启动它们中的每一个? 感谢。

1 个答案:

答案 0 :(得分:0)

如果您在2.3及以上版本上构建,则不需要,它会自动将其显示在状态栏中。像这样做, 来自commonsware的代码,

    private static final int DOWNLOAD_SUCCESSFUL = 100;
private static final int DOWNLOAD_FAILED = 99;
    private DownloadManager mgr=null;

on create执行此操作,

`mgr = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);    

        registerReceiver(onComplete,
                 new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

`

然后在文件下载的点击事件中,

lastDownload = mgr.enqueue(new DownloadManager.Request(uri) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false) .setTitle("Test File") .setDescription("Download zipped file.") .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, file_name));

然后是你的donwnload竞争的广播接收器,

BroadcastReceiver onComplete=new BroadcastReceiver() {
        public void onReceive(Context ctxt, Intent intent) {

            findViewById(R.id.start).setEnabled(true);  

            File unzipFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),file_name);            

            //check for new file download
            //extract if it's a new download

            if (unzipFile.exists()) {
                new UnzipFile().execute();              
            } else {
                Toast.makeText(Main.this, "Download not found!", Toast.LENGTH_LONG).show();
            }           
        }
    };`