webentwicklung-frage-antwort-db.com.de

Zeitlimit für Serveranfrage mit "Volley" nur für Android, nicht für iOS

In einer meiner Anwendungen sende ich eine Anfrage an den Server mit volley von Google .

Problem: Timeout- und Fehlerobjekt ist bei onErrorResponse(VolleyError error) null

Was ich bisher ausprobiert habe:

1) Zuerst habe ich ein Null-Fehlerobjekt bekommen, also habe ich es mit dem folgenden Code gelöst:

 @Override
 protected void deliverResponse(String response) {
    super.deliverResponse(response);
 }

 @Override
 public void deliverError(VolleyError error) {
     super.deliverError(error);
     DebugLog.e("deliverResponse", "getNetworkTimeMs : " + error.getNetworkTimeMs());
 }

Bisher habe ich festgestellt, dass timeout passiert, wenn ich das Fehlerobjekt null erhalte.

2) Jetzt gilt die Anwendung für Android und iOS und web, aber timeout kommt nur für Android vor.

Volley Log für Anfragen:

BasicNetwork.logSlowRequests: HTTP response for request

Anmerkung bearbeitet:

  1. Die auf dem Server entwickelten Webdienste sind für alle drei Instanzen (Android, Web und iOS) gleich.

  2. Timeout tritt auf, wenn zu viele Benutzer Anforderungen an den Server stellen.

  3. Ich habe eine Zeitüberschreitung von 2 Minuten festgelegt, obwohl die Zeitüberschreitung bei einem Volleyschuss nur manchmal 30 Sekunden beträgt .

  4. Ich habe viele Antworten, um den Server zu wechseln, aber da es nicht möglich ist, bitte keine andere Lösung.

Ich möchte auch hinzufügen, dass, wenn ich mehr Informationen darüber erhalten kann, wann eine Auszeit bei Volleyball möglich sein kann?

Referenzen, die ich durchlaufen habe:

Volley optimieren

httpclient-oft-mal-mit-wifi-geht-gut-mit-3g-out

long_xmlhttprequest_ajax_requests_timeout_on_Android

Bearbeitet:

Ich habe auch die Wiederholungsrichtlinie wie folgt festgelegt:

request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
                0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Und ich möchte auch nicht erneut versuchen, wenn die Verbindung Timeout.

Wie kann ich einen effizienten Service-Anruf tätigen, der das Problem für timeout lösen kann?.

Jede Hilfe wird geschätzt.

Vielen Dank.

11
AndiGeeky

Da ich zwei Monate lang versucht habe, eine Lösung für dieses Problem zu finden, habe ich keine perfekte Lösung gefunden. Obwohl ich einige Fakten wie folgt analysiere:

  1. Sie können die Leistung Ihres Servers verbessern
  2. Ich habe versucht, eine Web-Service-Anfrage mit HttpURLConnection zu stellen, bekomme aber immer noch das gleiche Problem.

Ich denke, dieses Problem ist nicht spezifisch für Volley, aber wenn Sie dieses Problem bekommen, dann würde ich vorschlagen, die Serverleistung durch das Anpassen von RetryPolicy zu erhöhen:

int x=2;// retry count
request.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 48,
                    x, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

Hoffe es wird helfen.

Vorschläge sind immer willkommen :)

Bitte kommentieren Sie unten, wenn Sie eine bessere Lösung gefunden haben.

Vielen Dank.!

4
AndiGeeky

IMHO können Sie sich auf Folgendes beziehen:

In BasicNetwork.Java finden Sie einige Informationen wie:

...
private static int SLOW_REQUEST_THRESHOLD_MS = 3000;
...
    /**
     * Logs requests that took over SLOW_REQUEST_THRESHOLD_MS to complete.
     */
    private void logSlowRequests(long requestLifetime, Request<?> request,
            byte[] responseContents, StatusLine statusLine) {
        if (DEBUG || requestLifetime > SLOW_REQUEST_THRESHOLD_MS) {
            VolleyLog.d("HTTP response for request=<%s> [lifetime=%d], [size=%s], " +
                    "[rc=%d], [retryCount=%s]", request, requestLifetime,
                    responseContents != null ? responseContents.length : "null",
                    statusLine.getStatusCode(), request.getRetryPolicy().getCurrentRetryCount());
        }
    }
...

// if the request is slow, log it.
long requestLifetime = SystemClock.elapsedRealtime() - requestStart;
logSlowRequests(requestLifetime, request, responseContents, statusLine);
...

Wenn Ihr Projekt also Googles Volley als Modul verwendet (keine JAR-Datei), können Sie BasicNetwork.Java aktualisieren und den SLOW_REQUEST_THRESHOLD_MS-Wert erhöhen, z. B. um 10000 (ms) oder mehr.

Eine weitere Option, laut @ neurons Antwort auf die folgende Frage:

Wie Netzwerk-Queue-Take in Android Volley optimieren? (Volley Google IO 2013)

Ich denke, Sie können versuchen, den Wert von NETWORK_THREAD_POOL_SIZE zu erhöhen, indem Sie den folgenden Konstruktor in Ihrer App verwenden:

public RequestQueue(Cache cache, Network network, int threadPoolSize) {
        this(cache, network, threadPoolSize,
                new ExecutorDelivery(new Handler(Looper.getMainLooper()))); }

P/S: Wenn nur die Zeilen BasicNetwork.logSlowRequests: HTTP response for request nicht mehr angezeigt werden sollen, ohne NETWORK_THREAD_POOL_SIZE zu erhöhen, muss nur die obige Zeile // kommentiert (logSlowRequests...) werden (wenn Ihre App Googles Volley als Modul verwendet - keine JAR-Datei). nicht compile mcxiaoke... in build.gradle Datei)

Ich hoffe es hilft!

2
BNK
public class JGet extends Request {
    private final Response.Listener listener;

    public JGet(final String url, List params,
                Response.Listener responseListener) {
        super(Request.Method.GET, NetUtils.getUrlWithParams(url, params), new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                NetUtils.dealVolleyError(volleyError, url);
            }
        });
        this.listener = responseListener;
        this.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 0, 1.0f));
        LogUtils.e("request-start--->");
        LogUtils.e(url);
        LogUtils.e(params);
        LogUtils.e("request-start--->");
    }
}

zeitlimit einstellen.

1
tiny sunlight

request.setRetryPolicy (neue DefaultRetryPolicy (50000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT))

0
Avinash

Versuchen Sie nicht, die Anweisung require zu verwenden, um eine Verbindung zu Ihrer Datenbank herzustellen, wenn Sie eine Anfrage an eine PHP -Datei mit Volley senden. Ich habe eine Zeitüberschreitung nur festgestellt, wenn ich so etwas verwende ("init.php" erforderlich). Wenn ich jedoch meine DB-Verbindungsinformationen direkt in dieselbe Datei lege, scheint alles in Ordnung zu sein.

0
ehab