【问题标题】:Loopj timeout exception in AndroidAndroid中的Loopj超时异常
【发布时间】:2014-05-30 19:35:03
【问题描述】:

我在使用 Loopj Async HTTP 库时遇到了一个奇怪的问题。我有时会使用 GET 或 POST 获得响应,有时响应会在很长一段时间后出现,有时响应根本不会出现。仅在使用 wifi 时才会发生这种情况。我在很多项目中都使用了 loopj,这些项目在 wifi 上都可以正常工作,但在这个项目中却不行。当我使用我的移动数据 3G 连接时,总是会有响应。我已经覆盖了 onFaliure 方法,这是当服务器没有响应时得到的:

E/statusCode(31980): 0
E/headers(31980): null
E/Throwable(31980): org.apache.http.conn.ConnectTimeoutException: Connect to .. timed out
E/errorResponse(31980): null

异常也会打印在 logcat 上:

04-16 10:58:18.795: W/System.err(31980): org.apache.http.conn.ConnectTimeoutException: Connect to .. timed out
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
04-16 10:58:18.795: W/System.err(31980):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
04-16 10:58:18.800: W/System.err(31980):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
04-16 10:58:18.800: W/System.err(31980):    at com.loopj.android.http.AsyncHttpRequest.makeRequest(AsyncHttpRequest.java:74)
04-16 10:58:18.800: W/System.err(31980):    at com.loopj.android.http.AsyncHttpRequest.makeRequestWithRetries(AsyncHttpRequest.java:91)
04-16 10:58:18.800: W/System.err(31980):    at com.loopj.android.http.AsyncHttpRequest.run(AsyncHttpRequest.java:54)
04-16 10:58:18.800: W/System.err(31980):    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390)
04-16 10:58:18.800: W/System.err(31980):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
04-16 10:58:18.800: W/System.err(31980):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
04-16 10:58:18.800: W/System.err(31980):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
04-16 10:58:18.800: W/System.err(31980):    at java.lang.Thread.run(Thread.java:841)
04-16 10:58:18.800: V/JsonHttpResponseHandler(31980): response body is null, calling onFailure(Throwable, JSONObject)

如果能给出一些解决方案,我将不胜感激。

【问题讨论】:

    标签: android exception timeout connection-timeout loopj


    【解决方案1】:

    试试这个:

    AsyncHttpClient client = new AsyncHttpClient();
    client.setTimeout(60000);
    

    这将设置请求超时,然后您将拥有所需的时间。

    【讨论】:

      【解决方案2】:

      这个bug是在1.4.4引入的;

      尝试改用这个库:https://github.com/leonardoxh/AsyncOkHttpClient

      这个库使用 OkHttp(来自 Square Inc.)而不是 Apache Http Client,也是 2.0 Loopj 库的代码

      ;)

      【讨论】:

        【解决方案3】:

        一年多后,此错误不断弹出。很有趣,即使堆栈跟踪说

        “响应体为空,调用onFailure(Throwable, JSONObject)”

        实际调用的方法是onFailure(statusCode, headers, throwable, (JSONObject) null);

        这是根据第 231 行 JsonHttpResponseHandler.java 这表明具有以下签名的方法是要被覆盖的方法:

        public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-25
          • 2013-06-30
          • 1970-01-01
          相关资源
          最近更新 更多