You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android下载视频时进度条不更新,如何修改进度更新逻辑?

嘿,我来帮你搞定这个进度条一直停在0%的问题!你的代码其实已经实现了下载功能,但进度更新的逻辑有几个关键漏洞,我来一步步给你修正:

问题根源分析

你的进度条不更新主要是这三个原因:

  1. AsyncTask泛型与更新方法不匹配:你定义的AsyncTask<String, Integer, String>第二个泛型参数是Integer(用来传递进度值),但onProgressUpdate方法却用了String类型参数,导致系统无法正确触发进度更新。
  2. 没有计算下载进度:代码里只是单纯读写文件,没有统计已下载的字节数,也没有和文件总大小对比计算百分比。
  3. 没有主动发布进度:下载过程中没有调用publishProgress()方法,把进度值传递给主线程更新UI。

修改后的完整代码

下面是修复后的代码,我已经标注了关键修改点:

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case progress_bar_type:
            pDialog = new ProgressDialog(this);
            pDialog.setMessage("Downloading file. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setMax(100);
            pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            pDialog.setCancelable(true);
            pDialog.show();
            return pDialog;
        default:
            return null;
    }
}

// 泛型保持<String, Integer, String>,第二个参数为Integer类型的进度值
class DownloadFile1 extends AsyncTask<String, Integer, String> {
    ProgressDialog bar;
    public String videoToDownload;
    public String fileName;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(progress_bar_type);
    }

    @Override
    protected String doInBackground(String... params) {
        try {
            mp4load(videoToDownload);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void mp4load(String urling) {
        try {
            System.out.println("Downloading");
            URL url = new URL(urling);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.connect();

            // 新增:获取待下载文件的总大小
            long totalFileSize = con.getContentLength();
            File SDCardRoot = Environment.getExternalStorageDirectory();
            File outputFile = new File(SDCardRoot, fileName);
            if (!outputFile.exists()) {
                outputFile.createNewFile();
            }

            FileOutputStream fos = new FileOutputStream(outputFile);
            InputStream is = con.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            // 新增:统计已下载的字节数
            long downloadedSize = 0;

            while ((len1 = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len1);
                // 更新已下载字节数
                downloadedSize += len1;
                // 计算当前进度百分比
                int progress = (int) ((downloadedSize * 100) / totalFileSize);
                // 关键:发布进度,触发onProgressUpdate
                publishProgress(progress);
            }

            fos.close();
            is.close();
            System.out.println("Downloaded");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 修改:参数类型改为Integer,和AsyncTask的泛型匹配
    @Override
    protected void onProgressUpdate(Integer... progress) {
        // 更新进度条的进度值
        pDialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(String file_url) {
        dismissDialog(progress_bar_type);
    }
}

关键修改点说明

  1. 修正onProgressUpdate参数类型:把原来的String... progress改成Integer... progress,和AsyncTask的泛型定义保持一致。
  2. 获取文件总大小:通过con.getContentLength()拿到待下载文件的总字节数,这是计算进度的基础。
  3. 实时计算并发布进度:在循环读取数据时,累加已下载的字节数,计算出当前进度百分比,然后调用publishProgress(progress)把进度值传递给主线程,更新进度条。

这样修改后,下载时进度条就会随着下载进度实时更新啦!

内容的提问来源于stack exchange,提问作者Nikeshh Vijayabaskaran

火山引擎 最新活动