2012-10-12 60 views
8

Estoy usando la gran biblioteca http asincrónica de loopj, pero me he encontrado con un pequeño inconveniente.Loopj Android Async Http - onFailure no activado

Si el usuario no tiene conexión a Internet o pierde su conexión, la aplicación simplemente no devolverá nada. Se espera esta parte, pero tampoco activa el método onFailure.

Además, el código que he usado cuando hay una conexión a Internet funciona, por lo que no hay ningún problema en el extremo del servidor.

Aquí hay algunos códigos que se reducen al mínimo. También no funciona (He probado esto también)

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

Gracias, Ashley

Respuesta

7

Usted puede intentar esto:

En AsyncHttpRequest->makeRequestWithRetries(), añadir una captura de SocketException así:

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

¡Esta es la solución! Ha sido [fusionado] (https://github.com/loopj/android-async-http/commit/f854f62633726ab38d2795d0c1e805212a4f0d76) por loopj! ¡Bonito one nicous! – dbro

+0

Me alegro de poder ayudar – nicous

+0

Hola, nicous, ¿cómo podemos editar AsyncHttpRequest.class? Por favor ayuda. ¿Hay alguna forma de editar este archivo .class dentro del archivo jar? –

7

Sí, por desgracia, la biblioteca de Android loopj no está muy bien diseñado. Si implementa los otrosonFailure devoluciones de llamada de uno de ellos debe disparar:

@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

Intenté estos más el error JSONObject. Lamentablemente, todavía no está funcionando. –

+0

No funciona para mí ni –

0

Try esto:

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