我正在使用异步任务从互联网上下载一些文件。对于这个问题,我知道向用户展示到目前为止的进展是非常相关的。我下载文件的所有实现都非常成功,但唯一的问题是进度对话框,即使下载命令已经启动,也显示0%。
我就是这样做的
// Show Dialog Box with Progress bar
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case progress_bar_type:
prgDialog = new ProgressDialog(this);
prgDialog.setMessage("Downloading Mp3 file. Please wait...");
prgDialog.setIndeterminate(false);
prgDialog.setMax(100);
prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
prgDialog.setCancelable(false);
prgDialog.show();
return prgDialog;
default:
return null;
}
}
// Async Task Class
class DownloadMusicfromInternet extends AsyncTask<String, String, String> {
// Show Progress bar before downloading Music
@Override
protected void onPreExecute() {
super.onPreExecute();
// Shows Progress Bar Dialog and then call doInBackground method
showDialog(progress_bar_type);
}
// Download Music File from Internet
@Override
protected String doInBackground(String... f_url) {
int count;
try {
URL url = new URL(f_url[0]);
URLConnection conection = url.openConnection();
conection.connect();
// Get Music file length
int lenghtOfFile = conection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(),10*1024);
// Output stream to write file in SD card
OutputStream output = new FileOutputStream(f_url[1]);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// Publish the progress which triggers onProgressUpdate method
publishProgress("" + (int) ((total * 100) / lenghtOfFile));
// Write data to file
output.write(data, 0, count);
}
// Flush output
output.flush();
// Close streams
output.close();
input.close();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
// While Downloading Music File
protected void onProgressUpdate(String... progress) {
// Set progress percentage
prgDialog.setProgress(Integer.parseInt(progress[0]));
}
// Once Music File is downloaded
@Override
protected void onPostExecute(String file_url) {
// Dismiss the dialog after the Music file was downloaded
dismissDialog(progress_bar_type);
Toast.makeText(getApplicationContext(), "Download complete, playing Music", Toast.LENGTH_LONG).show();
}
}
如果下载时间正在移动,请如何使进度移动。谢谢你的帮助。
更新
我认为这个问题与被称为重复的问题不同,我研究后的问题来自于int lenghtOfFile = conection.getContentLength();
进度没有移动,因为getContentLength()
总是返回-1,因为它无法从服务器获取文件大小。我看过很多像这样的问题没有回答。请问有没有出路?我很高兴知道。谢谢你的进步
答案 0 :(得分:0)
正如您在评论中所说,getContentLength()返回-1。这会导致进度更新始终为负,这意味着进度条永远不会前进。这就是为什么它没有像你期望的那样移动。
根据javadoc,getContentLength()在没有内容长度标题时返回-1,或者由于某种原因无法解析为数字。在这种情况下,您无法根据正在下载的文件大小提供进度表。