2012-10-12 7 views
8

Ich benutze die große async http Bibliothek von loopj, aber ich habe in einen kleinen Haken geraten.Loopj Android Async Http - onFailure nicht gefeuert

Wenn der Benutzer keine Internetverbindung hat oder seine Verbindung verliert, wird die App nichts zurückgeben. Dieser Teil wird erwartet, aber er löst auch nicht die OnFailure-Methode aus.

Auch der Code, den ich verwendet habe, wenn es eine Internetverbindung gibt, funktioniert, so dass es kein Problem auf dem Server gibt.

Hier ist ein Code, der auf das Minimum reduziert ist. Es ist auch nicht funktioniert (ich getestet habe dies auch)

String url = getString(R.string.baseurl) + "/appconnect.php"; 
client.getHttpClient().getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true); 
client.get(url, null, new JsonHttpResponseHandler() 
{ 
    @Override 
    public void onSuccess(JSONArray response) 
    { 
     Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onFailure(Throwable e, JSONArray errorResponse) 
    { 
     Toast.makeText(getApplicationContext(), "Failure", Toast.LENGTH_SHORT).show(); 
    } 
}); 

Danke, Ashley

Antwort

7

du versuchen:

In AsyncHttpRequest->makeRequestWithRetries(), einen Haken zu SocketException wie folgt hinzu:

while (retry) { 
     try { 
      makeRequest(); 
      return; 
     } catch (UnknownHostException e) { 
      if(responseHandler != null) { 
       responseHandler.sendFailureMessage(e, "can't resolve host"); 
      } 
      return; 
     } catch (SocketException e){ 
      // Added to detect no connection. 
      if(responseHandler != null) { 
       responseHandler.sendFailureMessage(e, "can't resolve host"); 
      } 
      return; 
     } catch (IOException e) { 
      cause = e; 
      retry = retryHandler.retryRequest(cause, ++executionCount, context); 
     } catch (NullPointerException e) { 
      // there's a bug in HttpClient 4.0.x that on some occasions causes 
      // DefaultRequestExecutor to throw an NPE, see 
      // http://code.google.com/p/android/issues/detail?id=5255 
      cause = new IOException("NPE in HttpClient" + e.getMessage()); 
      retry = retryHandler.retryRequest(cause, ++executionCount, context); 
     } 
    } 
+0

Dies ist die Lösung! Es wurde [zusammengeführt] (https://github.com/loopj/android-async-http/commit/f854f62633726ab38d2795d0c1e805212a4f0d76) von loopj! Schön ein NICO! – dbro

+0

Ich bin froh, dass ich helfen konnte – nicous

+0

Hallo Nicous, wie können wir AsyncHttpRequest.class bearbeiten Bitte helfen. Gibt es eine Möglichkeit, diese .class-Datei in der JAR-Datei zu bearbeiten –

7

Ja, leider ist die loopj Android-Bibliothek ist nicht sehr gut gestaltet. Wenn Sie die andereonFailure Rückrufe von ihnen implementieren sollten Feuer:

@Override 
public void onFailure(Throwable e) { 
    Log.e(TAG, "OnFailure!", e); 
} 
@Override 
public void onFailure(Throwable e, String response) { 
    Log.e(TAG, "OnFailure!", e); 
} 
@Override 
public void onFailure(Throwable e, JSONArray errorResponse) { 
    Log.e(TAG, "OnFailure!", e); 
} 
+1

Ich habe diese und den JSONObject-Fehler ausprobiert. Leider funktioniert es immer noch nicht. –

+0

Nicht funktioniert für mich weder –

0

Try dies:

@Override 
protected Object parseResponse(byte[] responseBody) throws JSONException { 
    return super.parseResponse(responseBody); 
}