Как правильно отслеживать ход загрузки с помощью RequestBuilder?

#codenameone

#codenameone

Вопрос:

Я пытаюсь отслеживать ход загрузки. Я могу сделать это при загрузке, просто добавив ProgressListener в NetworkManager

Но при загрузке и выполнении того же самого я получаю только 1 обратный вызов с окончательным размером загрузки

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

ConnectionRequest кажется, есть public метод, который задает тип запроса setWriteRequest

Я использую terse, RequestBuilder который по умолчанию устанавливает значение setWriteRequest равным true , пока существует тело (которое есть)

Итак, я действительно не знаю, почему возвращается только 1 обратный вызов с размером загрузки. Я что-то упускаю?

Мой окончательный код выглядит примерно так

 ActionListener<NetworkEvent> progressListener = new ActionListener<NetworkEvent>(){
    @Override
    public void actionPerformed(NetworkEvent evt) {
        int getSentReceived = evt.getSentReceived();//this only gets total size, no partial upload progress received
    }
};
NetworkManager.getInstance().addProgressListener(progressListener);
RequestBuilder req = Rest.post(url).body(body).header("Content-Type", "application/json").fetchAsJsonMap(resp -> {
    NetworkManager.getInstance().removeProgressListener(progressListener);
});
  

Редактировать: я дважды проверил это поведение на симуляторе, Android и iOS

Ответ №1:

Это долгое время не работало должным образом: https://github.com/codenameone/CodenameOne/issues/3043

Там также есть это: https://github.com/codenameone/CodenameOne/issues/2087

Суть проблемы в том, что загрузка не работает так, как загрузка. При загрузке мы делаем запрос к файлу и получаем его обратно. Upload записывает поток в тело запроса, а затем отправляет этот запрос. Итак, запись потока в тело выполняется быстро (и показывает прогресс), но тогда отправка для нас является атомарной, поэтому у нас нет способа это отслеживать.

Единственный реальный обходной путь — избегать загрузки из нескольких частей или разбивать вашу загрузку на более мелкие отдельные части. Вы можете использовать websockets, которые предоставляют отслеживаемые API более низкого уровня.

Ответ №2:

Редактировать: в итоге я реализовал это в iOS и Android изначально и опубликовал для него CN1Lib, который использует простой пример (загрузка одного текстового файла и отслеживание прогресса)

https://github.com/javieranton-zz/ProgressUploader

Комментарии:

1. Круто, возможно, в будущем стоит перенести это в cn1lib