Java 写入(缓冲区,0,缓冲区大小); bytesAvailable=fileInputStream.available(); publishProgress((int)((progress*100)/(file.length()); bufferSize=Math.min(字节可用,maxBufferSize); bytesRead=fileInputStream.read(缓冲区,0,缓冲区大小); 进度+=字节读取; }//while语句结束 fileInputStream.close(); 出版进度(100); outputStream.flush(); outputStream.close(); }//试体末端 捕获(例外情况除外) { //例如printStackTrace(); Log.e(“错误:,例如getMessage()); } 返回null; }//底底法 //更新进展情况 @凌驾 public void onProgressUpdate(整型…值) { super.onProgressUpdate(值); dialog.setProgress(值[0]); }//onProgressUpdate结束 //完成进度后,对话框将消失! @凌驾 PostExecute上的公共作废(作废结果) { 尝试 { dialog.dismise(); }//第二个try正文的结尾 捕获(例外e) { } }//onPostExecute方法的结束 }//异步任务类的结束 }//干管末端
您的循环应该是这样的,代码中有几个逻辑错误Java 写入(缓冲区,0,缓冲区大小); bytesAvailable=fileInputStream.available(); publishProgress((int)((progress*100)/(file.length()); bufferSize=Math.min(字节可用,maxBufferSize); bytesRead=fileInputStream.read(缓冲区,0,缓冲区大小); 进度+=字节读取; }//while语句结束 fileInputStream.close(); 出版进度(100); outputStream.flush(); outputStream.close(); }//试体末端 捕获(例外情况除外) { //例如printStackTrace(); Log.e(“错误:,例如getMessage()); } 返回null; }//底底法 //更新进展情况 @凌驾 public void onProgressUpdate(整型…值) { super.onProgressUpdate(值); dialog.setProgress(值[0]); }//onProgressUpdate结束 //完成进度后,对话框将消失! @凌驾 PostExecute上的公共作废(作废结果) { 尝试 { dialog.dismise(); }//第二个try正文的结尾 捕获(例外e) { } }//onPostExecute方法的结束 }//异步任务类的结束 }//干管末端,java,android,progressdialog,Java,Android,Progressdialog,您的循环应该是这样的,代码中有几个逻辑错误 // Read file bytesRead = fileInputStream.read(buffer, 0, bufferSize); progress=0; progress+=bytesRead; while (bytesRead > 0) { outputStream.write(buffer, 0, bufferSize); bytesAvailable = fileInputStream.available(
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress=0;
progress+=bytesRead;
while (bytesRead > 0)
{
outputStream.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress/file.length())*100));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress+=bytesRead;
}//end of while statement
更新:我刚刚注意到,您使用了20MB的缓冲区,将
maxBufferSize
更改为int-maxBufferSize=1024
,它应该可以工作。我注意到的问题是:
- 您的
可以是文件的总长度。因此,在一次读取中,缓冲区可能已满。我将其更改为512,以在progressbar中获得明显的更改bufferSize
- 在循环内重置
变量进度
- 此外,您正在将整个缓冲区(即从
写入0
)写入输出流。不是真正的“bytesRead”。在最后部分,您可能会得到错误值bufferSize
- 在再次阅读之前,您没有重新存储
缓冲区
bufferSize = 512;
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress=0;
while (bytesRead > 0)
{
progress+=bytesRead;
outputStream.write(buffer, 0, bytesRead);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress*100)/(file.length())));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}//end of while statement
fileInputStream.close();
publishProgress(100);
outputStream.flush();
outputStream.close();
我试过了,但问题还是一样,对话没有进展,我更新了答案。首先,在循环中将
bytesRead
添加到progress
中两次。第二,在循环的每个迭代中将进度设置为0。第三,你计算百分比的数学是错误的。
bufferSize = 512;
buffer = new byte[bufferSize];
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
progress=0;
while (bytesRead > 0)
{
progress+=bytesRead;
outputStream.write(buffer, 0, bytesRead);
bytesAvailable = fileInputStream.available();
publishProgress((int)((progress*100)/(file.length())));
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}//end of while statement
fileInputStream.close();
publishProgress(100);
outputStream.flush();
outputStream.close();