2016-04-01 12 views
0

Ich benutze RoboSpice mit OkHttpClient Modul (OkHttpSpiceService) für ziemlich lange Zeitanforderungen. Zu diesem Zweck muss ich die Timeouts des HTTP-Clients erhöhen, also habe ich sie auf 120 Sekunden gesetzt und gesetzt.Laufzeit des Aufrufs von loadDataFromNetwork() von RoboSpice Service erhöhen

@Override 
    protected OkHttpClient createOkHttpClient() { 
      OkHttpClient okHttpClient = super.createOkHttpClient(); 
      okHttpClient.setConnectTimeout(120, TimeUnit.SECONDS); 
      okHttpClient.setReadTimeout(120, TimeUnit.SECONDS); 
      okHttpClient.setWriteTimeout(120, TimeUnit.SECONDS); 
      return okHttpClient; 
} 

I-Caching-Option nicht verwenden, so dass ich SpiceRequest rufe von

getSpiceManager().execute(spiceRequest, this); 

Danach SpiceService loadDataFromNetwork() alle 30 Sekunden (3 mal) aufgerufen wird, wenn das Ansprechen nicht oder steht vor der Tür ist in dieser kurzen Zeit nicht erreichbar .

Ist es möglich, die Zeit des Aufrufs loadDataFromNetwork() zu erhöhen oder zu ändern? Ich weiß, dass ich nach einer Minute Antwort bekomme, aber mit diesen Methoden kann ich keine angemessene Reaktion erreichen.

Antwort

0

standardmäßig RoboSpice verwendet eine DefaultRetryPolicy wie folgt aus:

/** The default number of retry attempts.*/  
public static final int DEFAULT_RETRY_COUNT = 3; 

/** The default delay before retry a request (in ms). */ 
public static final long DEFAULT_DELAY_BEFORE_RETRY = 2500; 

Was können Sie tun, ist Ihre eigene Wiederholungspolitik durch die Erweiterung DefaultRetryPolicy Klasse zu implementieren, und durch das Überschreiben dieser zwei Methoden:

public class CustomRetryPolicy extends DefaultRetryPolicy { 
    @Override 
    public int getRetryCount() { return 1; } 

    @Override 
    public long getDelayBeforeRetry() { return 120L * 1000; } 
} 

Dann können Sie Ihre benutzerdefinierte Wiederholungsrichtlinie wie folgt verwenden:

spiceRequest.setRetryPolicy(new CustomRetryPolicy()); 
hier

Werfen Sie einen Blick: https://github.com/stephanenicolas/robospice/wiki/Advanced-RoboSpice-Usages-and-FAQ#how-can-i-setup-a-retry-policy-for-failed-requests-

I-Caching-Option nicht verwenden, so dass ich SpiceRequest von getSpiceManager().execute(spiceRequest, this);

Durch die Art und Weise nennen, dies nicht zu stoppen RoboSpice aus der Cache verwendet wird. Um wirklich SpiceService verwenden, um den Cache zu stoppen müssen Sie createCacheManager Methode in Ihrer eigenen OkHttpSpiceService Implementierung wie diese außer Kraft zu setzen:

public class MyOkHttpSpiceService extends OkHttpSpiceService { 

@Override 
public CacheManager createCacheManager(Application application) { 
    // Just return an empty CacheManager 
    return new CacheManager() { 
     @Override 
     public <T> T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException, CacheCreationException { 
      return data; 
     } 
    }; 
} 

}

+0

OK ich werde mit diesen Werten versuchen. Ich habe RetryPolicy-Werte geändert, indem ich meine benutzerdefinierte RetryPolicy implementiert habe, aber immer habe ich mehr als eine Anfrage gemacht, und nachdem ich das Verzögerungsflag manipuliert habe, bekomme ich immer das gleiche Ergebnis. Es sieht so aus, als ob die Anfrage nach 30 Sekunden und die nächste Anfrage nach 120 Sekunden (wenn Flag auf 120L gesetzt wurde) gesendet wurde. –

+0

Es sieht so aus, als würde auf einer Serverseite ein Timeout von 30 Sekunden auftreten.Ich vermute, dass es im ersten Fall 30 Sekunden Netzwerkzeit und 2,5 Sekunden Robospices Standard-Wiederholungs-Timeout waren. Im zweiten Fall sollte es 30 Sekunden Netzwerkzeit und 120 Sekunden RoboSpice's Wiederholungs-Timeout geben. Versuchen Sie, Wireshark zu verwenden, um zu sehen, was wirklich mit Vernetzung geschieht. Es sieht verdächtig aus, dass Timeouts so häufig vorkommen. – mykolaj

+0

Nach einigen Tagen komme ich auf dieses Thema zurück und habe einige Bemerkungen. Zunächst einmal löst Ihr Ansatz das Problem, aber nicht zu 100%. Es erhöht die Zeit der Anfrage, aber in Form von Verzögerung. Ich sehe, dass der Server, den ich benutze, mich nach 10 Sek. Timeout sendet und nach diesem Robospice wartet DELAY TIME in CustomRetryPolicy. Es ist in Ordnung, denn Server hat auch meine Anfrage zwischengespeichert und wenn die Antwort bereit ist, sende sie mich in der nächsten Anfrage. –

0

Die Antwort zur Verfügung gestellt von av_lee richtig ist, aber das Verfahren zur Definition eines benutzerdefinierten Retry Policy für RoboSpice ist nicht korrekt. Der oben genannte Code führt bei einem Fehler zu einem wiederholten Anrufversuch. RoboSpice verwendet immer den von getRetryCount() zurückgegebenen Wert und dekrementiert ihn nach dem erneuten Versuch, aber beim nächsten Mal erhält er wieder den Wert 1 und so weiter. Die richtige Methode zum Implementieren einer benutzerdefinierten Wiederholungsrichtlinie besteht darin, Werte der DefaultRetryPolicy-Klasse festzulegen.

public class CustomRetryPolicy extends DefaultRetryPolicy { 
    public CustomRetryPolicy(int retryCount) { 
     super(retryCount, DEFAULT_DELAY_BEFORE_RETRY, DEFAULT_BACKOFF_MULT); 
    } 
} 

In diesem oben Code ist retryCount die Anzahl der Wiederholungen Sie für Ihre Anfrage und Standardwerte für die Verzögerung wollen vor dem erneuten Versuch und Backoff-Multiplikator verwendet werden. Sie können Ihre bevorzugten Werte für jeden dieser drei Werte verwenden.