Korzystam z nowej struktury Volley dla Androida, aby wysłać żądanie do mojego serwera. Ale upływa limit czasu przed otrzymaniem odpowiedzi, chociaż nie odpowiada.
Próbowałem dodać ten kod:
HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
HttpConnectionParams.setSoTimeout(httpParams, timeoutMs);
w HttpClientStack
strukturze Volley do innej liczby całkowitej (50000), ale nadal upływa limit czasu przed 50 sekundami.
Czy istnieje sposób na zmianę limitu czasu na długą wartość?
android
timeout
android-volley
Cissmayazz
źródło
źródło
HttpClient
klasy.Odpowiedzi:
Zobacz
Request.setRetryPolicy()
i konstruktorDefaultRetryPolicy
npźródło
Aby obsłużyć Android Volley Timeout, musisz użyć
RetryPolicy
RetryPolicy
RetryPolicy
to interfejs, w którym musisz zaimplementować logikę tego, w jaki sposób chcesz ponowić określone żądanie w przypadku przekroczenia limitu czasu.Zajmuje się tymi trzema parametrami
Np. Jeśli RetryPolicy jest tworzony z tymi wartościami
Spróbuj ponownie 1:
Spróbuj ponownie 2:
Pod koniec próby ponownej próby 2, jeśli nadal występuje limit czasu gniazda, Volley rzuci a
TimeoutError
w moduł obsługi odpowiedzi na błąd interfejsu użytkownika.źródło
RetryPolicy
faktycznie robi wdrożenie.new DefaultRetryPolicy(
i pamiętaj, aby nigdy nie używać go ponownieRetryPolicy
, ponieważ obiekt jest przywoływany przez cały proces żądania, a przyrosty ponownych prób są dodawane w stosunku do tej samej wartości limitu czasu obiektu, dzięki czemu twoje przyszłe limity czasu oczekiwania rosną nieskończeniePo prostu przyczynić się do mojego podejścia. Jak już odpowiedziano,
RetryPolicy
jest to najlepsza droga. Ale jeśli potrzebujesz polityki innej niż domyślna dla wszystkich swoich żądań, możesz ustawić ją w podstawowej klasie Żądania, więc nie musisz ustawiać zasad dla wszystkich instancji twoich żądań.Coś takiego:
W moim przypadku mam GsonRequest, który rozciąga się od tego BaseRequest, więc nie ryzykuję, że zapomnę ustawić zasady dla konkretnego żądania i nadal możesz je zastąpić, jeśli jakieś konkretne żądanie tego wymaga.
źródło
źródło
Możesz ustawić
MY_SOCKET_TIMEOUT_MS
jako 100. Cokolwiek chcesz ustawić, to w milisekundach.DEFAULT_MAX_RETRIES
może być 0 domyślnie jest 1.źródło
źródło
Innym sposobem na to jest niestandardowe JsonObjectRequest przez:
Źródło: Android Volley Example
źródło
Alternatywne rozwiązanie, jeśli wszystkie powyższe rozwiązania nie działają dla Ciebie
Domyślnie Volley ustawia limit czasu zarówno dla obu, jak
setConnectionTimeout()
isetReadTimeout()
dla wartości zRetryPolicy
. W moim przypadkuVolley
zgłasza wyjątek limitu czasu dla dużej porcji danych patrz:Moim rozwiązaniem jest stworzenie klasy, która rozszerza się
HttpStack
z moimi własnymisetReadTimeout()
zasadami. Następnie użyj go, gdy tworzy sięRequestQueue
w następujący sposób:źródło
Skończyło się na dodanie metody
setCurrentTimeout(int timeout)
doRetryPolicy
i to wdrożenie wDefaultRetryPolicy
.Następnie dodałem a
setCurrentTimeout(int timeout)
do klasy Request i nazwałem ją.To chyba działa.
Przy okazji przepraszam za lenistwo i brawo za open source.
źródło