2

AndroidHttpClientにProgressDialogを実装したい。ここで、 CountingMultipartEntityの簡単な実装を見つけました。 さらに、コンテンツの長さのサポートを追加しました。メソッドをオーバーライドします。 FileBodyのアップロードはほぼ正常に機能します。アップロードに1つのファイルが含まれている場合は完全に機能しますが、2つのファイルがある場合は、2番目のファイルは部分的にしかアップロードされません。InputStreamBodyは機能しますが、 InputStream の長さをカウントしない場合に限ります。だから私はそれをリセットする必要がありますが、どうやって?
addPart

ここで私のオーバーライド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バイトしかないので、そこにあるべきではありません。しかし、それはとても重要です。

まず、ストリームをリセットする必要があると思いました。後に呼び出されるリセットは、 IOExceptionin.getReadedBytes();につながります。

アドバイスありがとうございます。

4

1 に答える 1

1

私は自分の間違いを見つけました。送信に重要なメソッドを上書きしましたgetContentLength()が、自分のバージョンを削除した後、ファイル送信は正常に機能します。

InputStreamのサイズを取得するために、上記のクラスを使用しましたが、 ObjectInputStreamによってStreamCorruptedExceptiongetBytesRead()が発生するため、メソッドを編集しました。

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

    return bytesRead;
}

コンテンツの長さを取得するにはgetContentLength()、ストリームがない場合に指定されたメソッドを使用できます。
それ以外の場合は、独自のコンテンツ長の計算を実装する必要があります。上記の方法addPart(String name, ContentBody cb)はアプローチを提供します。MultiPartyEntityクラスとHttpMultipartクラスから取得できるコンテンツの長さの計算に関する詳細。

于 2011-06-20T11:56:40.903 に答える