Loopj Android Async Http - onFailure not fired

10,463

Solution 1

You can try this:

In AsyncHttpRequest->makeRequestWithRetries(), add a catch to SocketException like this:

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

Solution 2

Yeah, unfortunately the loopj Android library isn't very well designed. If you implement the other onFailure callbacks one of them should fire:

@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);
}
Share:
10,463
Ashley Staggs
Author by

Ashley Staggs

I create websites, apps, games and do vfx and music

Updated on June 16, 2022

Comments

  • Ashley Staggs
    Ashley Staggs almost 2 years

    I am using the great async http library from loopj, but I have run into a small snag.

    If the user has no internet connection or loses their connection, the app just won't return anything. This part is expected, but it also doesn't fire the onFailure method.

    Also, the code I have used when there is an internet connection does work so there is no problem on the server end.

    Here is some code that is stripped down to the minimum. It also doesn't work (I have tested this too)

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

    Thanks, Ashley

  • Ashley Staggs
    Ashley Staggs over 11 years
    I tried these plus the JSONObject failure. Unfortunately it still isn't working.
  • dbro
    dbro over 11 years
    This is the solution! It's been merged by loopj! Nice one nicous!
  • Mathew M Visacanthara
    Mathew M Visacanthara almost 9 years
    Hi nicous, how can we edit AsyncHttpRequest.class Please help . Is there any way to edit this .class file inside the jar file