2017-03-04 5 views
-1

Ich arbeite an Android-App, bekomme ich oft HTTP-Fehler 500, wenn ich versuche, auf die URL wegen schlechter Konnektivität zuzugreifen, die meine App zum Scheitern verurteilt. Antwort von URL zurückgegeben wird, ist im JSON-Format so, um diese json zu parsen i verwenden jackson apiautomatisch verbinden im Fehlerfall

JsonNode monthlyUrlNode = objectMapper.readValue(url, JsonNode.class); 

Im Fall des Scheiterns ich mag mit einer Verzögerung von 30 Sekunden bis url wieder zu verbinden

i bezeichnet dies Retry a connection on timeout in Java, aber es ist nicht viel Nutzen für mich

+0

Könnten Sie den Code mit Änderungen von http://stackoverflow.com/questions/7312794/retry-a-connection-on-timeout-in-java teilen? Meine Empfehlung ist, dass Sie den Stream an Ihrem Anwendungsende erwerben und ihn dann zum Verarbeiten von JSON verwenden sollten. Im Falle einer Ausnahme können Sie das Netzwerk entsprechend Ihrer Logik entsprechend behandeln, anstatt von der Jackson-API abhängig zu sein, um Ihre Fehlerbehandlung zu realisieren. –

Antwort

0

Haben Sie über die Verwendung eines Proxy-Objekts gedacht? Mit Proxy können Sie eine Schnittstelle so umbrechen, dass Sie denselben Eingriff unabhängig von der aufgerufenen Methode ausführen können. Angenommen, Sie haben bereits ein Clientobjekt für den Zugriff auf die Schnittstelle SomeService erstellt. Dann können Sie eine Proxy-Klasse mit einem 30-Sekunden-Wiederholungs erstellen eingebaut:

public class ServiceProxy implements InvocationHandler { 
    private final SomeService realClient; 
    public ServiceProxy(SomeService realClientObject) { 
     this.realClient = realClientObject; 
    } 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
     Object result = method.invoke(realClient, args); 
     if (result instanceof URL) { 
      JsonNode urlNode = objectMapper.readValue(url, JsonNode.class); 
      if (some condition on urlNode) { 
      // Wait and retry 
      Thread.sleep(30000); 
      result = method.invoke(realClient, args); 
      } 
     } 
     return result; 
    } 
} 

Sie erstellen das Proxy-Objekt, indem es die ursprüngliche Schnittstelle vorbei, wie:

public class ProxyFactory { 
    public static SomeService get(SomeService originalClient) { 
     return (SomeService)Proxy.newProxyInstance(SomeService.class.getClassLoader(), 
       new Class[]{SomeService.class}, 
       new ServiceProxy(originalClient)); 
    } 
} 
0

Wenn Sie diese Art von benötigen Feinkontrolle, übergeben Sie keine URL an Jackson. Verwenden Sie eine geeignete HTTP-Bibliothek, um den Inhalt aus der URL in den Speicher zu lesen, wiederholen Sie den Vorgang wie erforderlich und geben Sie ihn dann an Jackson weiter.

Verwandte Themen