2012-10-12 6 views
8

Sto usando la grande libreria HTTP asincrona da loopj, ma ho incontrato un piccolo inconveniente.Loopj Android Async Http - onFailure non attivato

Se l'utente non ha una connessione Internet o perde la connessione, l'app non restituirà nulla. Questa parte è prevista, ma non attiva il metodo onFailure.

Inoltre, il codice che ho usato quando c'è una connessione internet funziona così non ci sono problemi sul lato server.

Ecco un codice ridotto al minimo. Inoltre non funziona (ho provato anche questo)

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(); 
    } 
}); 

Grazie, Ashley

risposta

7

si può provare questo:

In AsyncHttpRequest->makeRequestWithRetries(), aggiungere una cattura a SocketException in questo modo:

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

Questa è la soluzione! È stato [unito] (https://github.com/loopj/android-async-http/commit/f854f62633726ab38d2795d0c1e805212a4f0d76) di loopj! Bello, nico! – dbro

+0

Sono felice di poter aiutare – nicous

+0

Ciao nicous, come possiamo modificare AsyncHttpRequest.class Per favore aiuto. C'è un modo per modificare questo file .class all'interno del file jar –

7

Sì, purtroppo la libreria Android loopj non è molto ben progettato. Se si sceglie di implementare le altrionFailure callback uno di loro dovrebbe fuoco:

@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

Ho provato questi più l'errore JSONObject. Sfortunatamente non funziona ancora. –

+0

Non funziona neanche per me –

0

Try this:

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