2093


LollipopにてVolleyのリクエスト(GET or POST)を実行した際に 極稀に瞬時にErrorListenerがコールされてしまいます。

Lollipopのバージョンは5.0.0および5.0.1どちらでも発生します。 （体感的には5.0.1は頻度が減ったようにも感じますが再現はしています）
機種はNexus4, Nexus5, Nexus7 2012です。

VolleyErrorの内容を見るとstatusCodeはなしで 例外内容はInterruptedIOExceptionとなっていました。

どうやらスレッド関連で発生しているようなのですが根本原因が分かりません。 同事象が発生している方、対応された方、ご教示をお願い致します。

【追記】 以下にVolleyのデバッグログを添付致します。

[code]

    D/Volley﹕ [615] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://example.com/system/tags/photos/53/android.png 0x66a0ca3a LOW 68> [lifetime=66], [size=13900], [rc=200],     [retryCount=0]
    D/Volley﹕ [1] MarkerLog.finish: (80   ms) [ ] http://example.com/system/tags/photos/53/android.png 0x66a0ca3a LOW 68
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-miss
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [615] network-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+66  ) [615] network-http-complete
    D/Volley﹕ [1] MarkerLog.finish: (+6   ) [615] network-parse-complete
    D/Volley﹕ [1] MarkerLog.finish: (+8   ) [615] network-cache-written
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [615] post-response
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] done
    D/Volley﹕ [614] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://example.com/system/tags/photos/50/android.png ], [retryCount=0]
    D/Volley﹕ [1] MarkerLog.finish: (114  ms) [ ] http://example.com/system/tags/photos/50/android.png 0x66a0ca3a LOW 67
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-miss
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [614] network-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+100 ) [614] network-http-complete
    D/Volley﹕ [1] MarkerLog.finish: (+5   ) [614] network-parse-complete
    D/Volley﹕ [1] MarkerLog.finish: (+9   ) [614] network-cache-written
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [614] post-response
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] done
    D/Volley﹕ [613] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] https://graph.facebook.com/1234/picture?type , [retryCount=0]
    D/Volley﹕ [1] MarkerLog.finish: (326  ms) [ ] https://graph.facebook.com/1234/picture?type 0x5280aaf9 LOW 66
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
    D/Volley﹕ [1] MarkerLog.finish: (+1   ) [612] cache-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-miss
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [613] network-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+301 ) [613] network-http-complete
    D/Volley﹕ [1] MarkerLog.finish: (+4   ) [613] network-parse-complete
    D/Volley﹕ [1] MarkerLog.finish: (+20  ) [613] network-cache-written
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [613] post-response
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] done
    V/Volley﹕ [618] CacheDispatcher.run: start new dispatcher
    D/Volley﹕ [1] MarkerLog.finish: (160  ms) [ ] https://api.example.com/ja+9/articles/9005?page=1 0x1afe3f66 NORMAL 69
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [ 1] add-to-queue
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+0   ) [612] cache-miss
    D/Volley﹕ [1] MarkerLog.finish: (+1   ) [616] network-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+61  ) [616] post-error
    D/Volley﹕ [1] MarkerLog.finish: (+98  ) [ 1] done
    
[/code]


CC BY-SA 3.0
2014-12-19T03:53:52.130
2089
2014-12-19T08:03:51.610
2014-12-19T07:31:33.420
2877
2877
question
android java android-volley
AndroidLollipopにてVolleyのリクエストが稀に失敗する


より詳細な情報があったほうがいいかもしれません。Volleyのデバッグログを出力してみてはどうでしょう。

Volleyのデバッグを有効化するにはshellから次のコマンドを利用してください。

> adb shell setprop log.tag.Volley VERBOSE

このデバッグログの設定は[VolleyLog.java](http://tools.oesf.biz/android-5.0.1_r1.0/xref/frameworks/volley/src/com/android/volley/VolleyLog.java#VolleyLog)でこのように参照されています。

[code]

    public class VolleyLog {
        public static String TAG = "Volley";
        public static boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE);
        ...省略...
    }
    
[/code]

ログが取れれば内部のどのステップで発生しているか、という問題が出てくると思いますが、[この記事](http://techbooster.org/android/hacks/16474/)に少しだけ内部構造をのせています。参考になれば。

[追記]

Volleyライブラリのデバッグ手法の例になると思ったので情報を補足して追記しました。

Volleyのデバッグログではリクエストごとに処理がどこまで進んだか内容が確認できます。今回のログでは最後にpost-errorがありました。

[code]

    D/Volley﹕ [1] MarkerLog.finish: (+1   ) [616] network-queue-take
    D/Volley﹕ [1] MarkerLog.finish: (+61  ) [616] post-error
    D/Volley﹕ [1] MarkerLog.finish: (+98  ) [ 1] done
    
[/code]

ここが原因だと想定して調査した結果、Volleyの[BasicNetwork.java](http://tools.oesf.biz/android-5.0.1_r1.0/xref/frameworks/volley/src/com/android/volley/toolbox/BasicNetwork.java#128)にてIOExceptionがthrowされているのを見つけました。

statusCodeで200~299以外がかえるとIOExceptionを投げています。

[code]

         if (statusCode < 200 || statusCode > 299) {
             throw new IOException();
         }
         return new NetworkResponse(statusCode, responseContents, responseHeaders, false);
     } catch (SocketTimeoutException e) {
         attemptRetryOnException("socket", request, new TimeoutError());
     } catch (ConnectTimeoutException e) {
         attemptRetryOnException("connection", request, new TimeoutError());
     } catch (MalformedURLException e) {
         throw new RuntimeException("Bad URL " + request.getUrl(), e);
     } catch (IOException e) {
         int statusCode = 0;
         NetworkResponse networkResponse = null;
         if (httpResponse != null) {
             statusCode = httpResponse.getStatusLine().getStatusCode();
         } else {
             throw new NoConnectionError(e);
         }
    
[/code]

Volleyのソースコードを読むと、質問にあった「statusCodeがない（=0?）」という情報と一致するエラー内容だと感じていますが、検証できず、確証はありません。リクエストしているURLを再確認してみてはいかがでしょうか。


CC BY-SA 3.0
2014-12-19T04:31:12.270
2093
2014-12-19T08:03:51.610
2014-12-19T08:03:51.610
395
395
2089
answer