Android下载视频时进度条不更新,如何修改进度更新逻辑?
嘿,我来帮你搞定这个进度条一直停在0%的问题!你的代码其实已经实现了下载功能,但进度更新的逻辑有几个关键漏洞,我来一步步给你修正:
问题根源分析
你的进度条不更新主要是这三个原因:
- AsyncTask泛型与更新方法不匹配:你定义的
AsyncTask<String, Integer, String>第二个泛型参数是Integer(用来传递进度值),但onProgressUpdate方法却用了String类型参数,导致系统无法正确触发进度更新。 - 没有计算下载进度:代码里只是单纯读写文件,没有统计已下载的字节数,也没有和文件总大小对比计算百分比。
- 没有主动发布进度:下载过程中没有调用
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); } }
关键修改点说明
- 修正
onProgressUpdate参数类型:把原来的String... progress改成Integer... progress,和AsyncTask的泛型定义保持一致。 - 获取文件总大小:通过
con.getContentLength()拿到待下载文件的总字节数,这是计算进度的基础。 - 实时计算并发布进度:在循环读取数据时,累加已下载的字节数,计算出当前进度百分比,然后调用
publishProgress(progress)把进度值传递给主线程,更新进度条。
这样修改后,下载时进度条就会随着下载进度实时更新啦!
内容的提问来源于stack exchange,提问作者Nikeshh Vijayabaskaran




