#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, который использует простой пример (загрузка одного текстового файла и отслеживание прогресса)
Комментарии:
1. Круто, возможно, в будущем стоит перенести это в cn1lib