Loopj Android Async Http – onFailure не запущен

Я использую отличную асинхронную http-библиотеку из loopj, но я столкнулся с небольшой проблемой.

Если пользователь не имеет подключения к Интернету или теряет соединение, приложение просто ничего не вернет. Ожидается эта часть, но она также не запускает метод onFailure.

Кроме того, код, который я использовал при подключении к Интернету, работает, поэтому на сервере нет проблем.

Вот код, который доведен до минимума. Он также не работает (я тоже это испытал)

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

Спасибо, Эшли

Вы можете попробовать следующее:

В AsyncHttpRequest->makeRequestWithRetries() добавьте catch в SocketException следующим образом:

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

Да, к сожалению, Android-библиотека loopj не очень хорошо спроектирована. Если вы реализуете другие onFailure вызовы onFailure один из них должен onFailure :

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

Попробуй это:

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