Загрузка HTTP HTTP Android для UrlEncodedFormEntity - PullRequest
2 голосов
/ 24 марта 2012

Существует несколько вопросов, в которых обсуждаются способы добавления индикации хода выполнения к загрузке файлов HTTP в Android с использованием формата данных multipart / form-data.Типичный предлагаемый подход воплощен в верхнем ответе в Не удается получить информацию о прогрессе при загрузке файла http POST (Android) - включите класс MultipartEntity из полной библиотеки Apache HTTPClient, а затем оберните входной поток этимиспользуется для получения данных в том количестве, которое подсчитывает байты по мере их чтения.

Этот подход работает в этом случае, но, к сожалению, не работает для запросов, отправляющих данные через UrlEncodedFormEntity, который ожидает, что его данные будут переданы ему вСтроки, а не InputStreams.

Итак, мой вопрос: какие существуют подходы для определения хода загрузки через этот механизм?

1 Ответ

6 голосов
/ 25 марта 2012

Вы можете переопределить метод #writeTo любой реализации HttpEntity и считать байты по мере их записи в выходной поток.

DefaultHttpClient httpclient = new DefaultHttpClient();
try {
   HttpPost httppost = new HttpPost("http://www.google.com/sorry");

   MultipartEntity outentity = new MultipartEntity() {

    @Override
    public void writeTo(final OutputStream outstream) throws IOException {
        super.writeTo(new CoutingOutputStream(outstream));
    }

   };
   outentity.addPart("stuff", new StringBody("Stuff"));
   httppost.setEntity(outentity);

   HttpResponse rsp = httpclient.execute(httppost);
   HttpEntity inentity = rsp.getEntity();
   EntityUtils.consume(inentity);
} finally {
    httpclient.getConnectionManager().shutdown();
}

static class CoutingOutputStream extends FilterOutputStream {

    CoutingOutputStream(final OutputStream out) {
        super(out);
    }

    @Override
    public void write(int b) throws IOException {
        out.write(b);
        System.out.println("Written 1 byte");
    }

    @Override
    public void write(byte[] b) throws IOException {
        out.write(b);
        System.out.println("Written " + b.length + " bytes");
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        out.write(b, off, len);
        System.out.println("Written " + len + " bytes");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...