2011-06-17 17 views
2

我想在我的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

感謝您的任何建議。

+1

你的意思是保留那個光禿禿的'in.getReadedBytes()'調用嗎?請注意,你正在調用它兩次。 – seh

+0

感謝您的建議。現在我有1個字節太多了。 – CSchulz

+2

請注意,即使InputStream#read()返回-1,表示* eos *,您也會碰到計數。您不應該計算上次讀取,因爲它只是返回標記值,而不是實際流內容中的字節。 – seh

回答

1

我發現了我的錯誤。我刪除了自己的版本後,覆蓋了對傳輸很重要的方法getContentLength(),文件傳輸工作正常。

爲了得到一個的InputStream我用上面的類,但編輯的方法getBytesRead()的大小,因爲的ObjectInputStream導致StreamCorruptedException

public long getBytesRead() { 
    try { 
     while (read() != -1) 
      ; 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return bytesRead; 
} 

獲取內容長度,你可以如果沒有任何流,請採用給定方法getContentLength()
否則,你必須實現自己的內容長度計算。上述方法addPart(String name, ContentBody cb)提供了一種方法。有關內容長度計算的更多詳細信息,您可以從類MultiPartyEntityHttpMultipart中獲得。