我想在我的AndroidHttpClient中實現ProgressDialog。我在這裏找到了一個簡單的實現CountingMultipartEntity。
其他我添加了內容長度支持。我重寫了方法addPart
。
FileBody上傳工作得很好。當上傳文件包含一個文件時,它的工作很完美,但是當有兩個文件時,第二個文件只上傳部分文件。
InputStreamBody的作品,但只有當我不計算InputStream的長度。所以我必須重置它,但是如何?Extended MultipartEntity不會正確寫出Stream
這裏我的首要addPart
:
@Override
public void addPart(String name, ContentBody cb) {
if (cb instanceof FileBody) {
this.contentLength += ((FileBody) cb).getFile().length();
} else if (cb instanceof InputStreamBody) {
try {
CountingInputStream in =
new CountingInputStream(((InputStreamBody) cb).getInputStream());
ObjectInputStream ois = new ObjectInputStream(in);
ois.readObject();
this.contentLength += in.getBytesRead();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
super.addPart(name, cb);
}
的CountingInputStream是的InputStream的簡單延伸:
public class CountingInputStream extends InputStream {
private InputStream source;
private long bytesRead = 0;
public CountingInputStream(InputStream source) {
this.source = source;
}
public int read() throws IOException {
int value = source.read();
bytesRead++;
return value;
}
public long getBytesRead() {
return bytesRead;
}
}
計數的工作差不多,只有2個字節,這不該不在那裏。但這是如此重要。
首先,我認爲流必須重新設置。在in.getReadedBytes();
之後調用的重置導致IOException。
感謝您的任何建議。
你的意思是保留那個光禿禿的'in.getReadedBytes()'調用嗎?請注意,你正在調用它兩次。 – seh
感謝您的建議。現在我有1個字節太多了。 – CSchulz
請注意,即使InputStream#read()返回-1,表示* eos *,您也會碰到計數。您不應該計算上次讀取,因爲它只是返回標記值,而不是實際流內容中的字節。 – seh