我正在使用Apache和Async在FTP上传文件。问题是在大文件(即200 Mb)上,进度条重新开始进度但上传仍在继续(我在计算机上检查了FTP)。
这是我在Logcat中看到的:
1->2->3->4->5->6->7->8-> -8 -> -7 .... to 8 and starts again
异步背景代码:
con = new FTPClient();
con.setConnectTimeout(300000);
con.setDataTimeout(300000);
// con.setKeepAlive(true);
con.connect("host IP",21);
if (con.login("user", "password"))
{
con.enterLocalPassiveMode(); // important!
con.setFileType(FTP.BINARY_FILE_TYPE);
boolean directoryExists = con.changeWorkingDirectory(Email);
File CloudVersionSysForRestore = new File(getFilesDir()+File.separator+"Cloud Version.itb");
try {
CloudVersionSysForRestore.createNewFile();
OutputStream OutstreamCloud = new FileOutputStream(new File(CloudVersionSysForRestore.getPath()));
con.retrieveFile("/"+Email+"/Cloud Version.itb", OutstreamCloud);
OutstreamCloud.close();
if(x!=2){
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(getFilesDir()+File.separator+"Cloud Version.itb")));
String read;
StringBuilder builder = new StringBuilder("");
while((read = bufferedReader.readLine()) != null) {
Log.w("READ", read);
builder.append(read);
}
bufferedReader.close();
long getintfromstring = Long.parseLong(builder.toString());
if(getintfromstring<Version){
Log.w("Version", String.valueOf(Version));
try{
/************************************ UPLOAD + Progress ****************************/
long fileSize = DBToUploadFromInternalStorage.length();
int sentBytes = 0;
InputStream inputStream = new FileInputStream(DBToUploadFromInternalStorage);
System.out.println("Start uploading second file");
OutputStream outputStream = con.storeFileStream("PilotLogbookDB.itb");
byte[] bytesIn = new byte[4 * 1024];
int read1 = 0;
while ((read1 = inputStream.read(bytesIn)) !=-1) {
outputStream.write(bytesIn, 0, read1);
sentBytes+=read1;
final int progress = (int) ((sentBytes * 100) / fileSize);
runOnUiThread(new Runnable() {
public void run() {
pd.setProgress(progress);
Log.w("Progress", String.valueOf(progress));
}
});
}
outputStream.close();
inputStream.close();
/************************************ UPLOAD + Progress ****************************/
}
catch(Exception e){
e.printStackTrace();
x=2;
}
boolean completed = con.completePendingCommand();
For Long是这样的吗?
/************************************ UPLOAD + Progress ****************************/
long fileSize = DBToUploadFromInternalStorage.length();
long sentBytes = 0;
InputStream inputStream = new FileInputStream(DBToUploadFromInternalStorage);
System.out.println("Start uploading second file");
OutputStream outputStream = con.storeFileStream("PilotLogbookDB.itb");
byte[] bytesIn = new byte[4 * 1024];
int read1 = 0;
while ((read1 = inputStream.read(bytesIn)) !=-1) {
outputStream.write(bytesIn, 0, read1);
sentBytes+=read1;
final long progress = (long) ((sentBytes * 100) / fileSize);
runOnUiThread(new Runnable() {
public void run() {
pd.setProgress(Long.bitCount(progress));
Log.w("Progress", String.valueOf(progress));
}
});
}
outputStream.close();
inputStream.close();
/************************************ UPLOAD + Progress ****************************/
答案 0 :(得分:0)
您使用int
作为进度计数器(sentBytes
),但是在行final int progress = /*...*/
中,您将进度计数器乘以100,这会减少您可以使用的实际字节数使用因子100,您应该通过将其更改为:
final int progress = (int) ((((double) sentBytes) / fileSize) * 100);
或者,如果您有更大的文件(> 2 GB),您可能更喜欢使用long
。