8

loopjの優れた非同期httpライブラリを使用していますが、小さな問題が発生しました。

ユーザーがインターネットに接続していないか、接続を失った場合、アプリは何も返しません。この部分は予期されていますが、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();
    }
});

ありがとう、アシュリー

4

3 に答える 3

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);
        }
    }
于 2012-11-12T21:02:34.713 に答える
7

ええ、残念ながら、loopjAndroidライブラリはあまりうまく設計されていません。他の onFailureコールバックを実装する場合、そのうちの1つが起動するはずです。

@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);
}
于 2012-10-12T21:33:10.047 に答える
0

これを試して:

@Override
protected Object parseResponse(byte[] responseBody) throws JSONException {
    return super.parseResponse(responseBody);
}
于 2014-09-25T02:00:00.427 に答える