我正在从服务器下载文件。我正在下载时用魔杖显示进度条。当我试图下载文件时,它显示进度条。它在栏中显示0,但我可以下载文件。我使用的代码如下所示
// onPreExecute
protected void onPreExecute() {
super.onPreExecute();
showDialog(progress_bar_type);
}
//这是一个用于下载的询问任务
protected String doInBackground(String... arg0) {
int bufferLength = 0;
try {
//geting connection
URL url = new URL( weburl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
// getting file length
int lenghtOfFile = urlConnection.getContentLength();
File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard, "filename.extension");
FileOutputStream fileOutput = new FileOutputStream(file);
InputStream inputStream = urlConnection.getInputStream();
byte[] buffer = new byte[1024];
long total = 0;
while ( (bufferLength = inputStream.read(buffer))!= -1) {
total += bufferLength ;
//progress
publishProgress(""+(int)((total*100)/lenghtOfFile));
fileOutput.write(buffer, 0, bufferLength);
}
我使用onProgressUpdate来显示结果但没有用。它仍然只有0
protected void onProgressUpdate(String...values) {
// setting progress percentage
pDialog.setProgress(Integer.parseInt(values[0]));
}
// onPostExecute
protected void onPostExecute(final Boolean success) {
dismissDialog(progress_bar_type);}
答案 0 :(得分:3)
long total = 0;
int iterationCount = 0;
int progress = 0;
while ( (bufferLength = inputStream.read(buffer))!= -1) {
total += bufferLength ;
progress = (int)((total*100)/lenghtOfFile)
if(iterationCount >= 14 || progress == 100) {
iterationCount = 0;
publishProgress(String.valueOf(progress));
} else {
iterationCount += 1;
}
fileOutput.write(buffer, 0, bufferLength);
}
根据您获取文件长度等于-1的问题
此信息并非始终可用。通常,您将知道要下载的文件的长度。根据网络服务器,协议,连接和下载方法,此信息可能并不总是可用。
您绝对应该修改您的应用程序,以便它可以处理这种情况。我想你会发现使用不同连接方法的不同设备会提供不同的结果。
答案 1 :(得分:1)
使用AsyncTask的onProgressUpdate()方法更新进度条。
参考link
答案 2 :(得分:1)
您需要在asynctask中添加一个覆盖方法
@Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
inDeterminatePB.setProgress(Integer.parseInt((values[0])));
}