2012-10-12 97 views
8

我使用loopj中的偉大異步http庫,但我遇到了一個小障礙。Loopj Android異步Http - onFailure未解僱

如果用戶沒有互聯網連接或失去他們的連接,該應用程序不會返回任何內容。這部分是預期的,但它也不會觸發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(); 
    } 
}); 

感謝, 阿什利

回答

7

你可以試試這個:

AsyncHttpRequest->makeRequestWithRetries(),一抓添加到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); 
     } 
    } 
+0

這是解決方案!它已被[合併](https://github.com/loopj/android-async-http/commit/f854f62633726ab38d2795d0c1e805212a4f0d76)by loopj!尼斯一個很好! – dbro

+0

我很高興我能幫到 – nicous

+0

嗨,我們該如何編輯AsyncHttpRequest.class請大家幫忙。有什麼方法可以在jar文件中編輯這個.class文件 –

7

呀,可惜循環J的Android庫沒有設計得非常好。如果要實現其他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); 
} 
+1

我試過這些加上JSONObject失敗。不幸的是它仍然無法正常工作。 –

+0

既不適用於我也不適用 –

0

嘗試這個:

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