2013-07-17 4 views
0

Я пытаюсь отобразить прогресс загрузки на моем Android Клиент, используя способ, указанный нижеMULTIPART Загрузить изображение Прогресс на Android

MultipartEntity reqEntity = new MultipartEntity(){ 
       @Override 
       public void writeTo(final OutputStream outstream) throws IOException { 
        super.writeTo(new UploadOutputStream(outstream,listener)); 
       } 

      }; 

public class UploadOutputStream extends FilterOutputStream { 

private final ProgressListener listener; 
private long transferred; 

public UploadOutputStream(final OutputStream out, final ProgressListener listener) 
{ 
    super(out); 
    this.listener = listener; 
    this.transferred = 0; 
} 

public void write(byte[] b, int off, int len) throws IOException 
{ 
    out.write(b, off, len); 
    this.transferred += len; 
    this.listener.transferred(this.transferred); 
} 

public void write(int b) throws IOException 
{ 
    out.write(b); 
    this.transferred++; 
    this.listener.transferred(this.transferred); 
} 



} 

Я добавляю изображение для мультисекционного ByteArrayBody ниже

reqEntity.addPart("image", bab); 

Проблема заключается в том, что я вижу обновление прогресса только тогда, когда загружено все изображение. Я хочу прогресс, когда загружаются куски.

Любая помощь очень ценится

Большое спасибо

Manan

+0

Может ли кто-нибудь направить меня к учебнику о том, как MultiPart работает под капотом, то есть как файл загружается в виде кусков байтов? – CommonMan

ответ

1

Выяснено, что проблема связана с тем, что я использовал ByteArrayBody, который НЕ отправляет файл в куски, вместо этого записывает весь поток сразу. Используется FileBody для решения проблемы.

1

Я не думаю, что это проблема с многочастного кодирования. Скорее всего, клиент HTTP оптимизирует запись, отправив один вызов write(), так как он знает размер и подходит для своих буферов. Этот вызов, скорее всего, блокируется, и ваш слушатель выполняется сразу после этого.

Вы можете разбить этот out.write(b, off, len) вызов на несколько небольших звонков с небольшим расходом скорости.

+0

Но мой файл больше 1 МБ. Как вы думаете, в этом случае HTTP-клиент будет писать его одним вызовом write() – CommonMan

+0

Легко проверить - установите точку останова на 'out.write (b, off, len);' и взгляните на размер массива байтов , off и len. В качестве альтернативы вы можете просто отображать ошибочное количество байтов - правильно ли вы вычисляете проценты? Ваш слушатель получает количество переданных байтов. – Delyan

+0

Спасибо Delyan. Я даже не пробовал% ge. Я попытался получить переданные байты. У меня две части в MultiPart. Один из них - json, а другой - образ. Для JSON я вижу байты по мере их переноса, но для изображения он возвращается только тогда, когда загружается все изображение. Единственное различие заключается в том, что json отправляется как StringBody и изображение как BysteArryBody. НЕ уверен, что это имеет значение. – CommonMan

Смежные вопросы