Volleyでやたらに start() を呼び出してはいけない
Androidのネットワーク周りをいい感じに担保してくれる Volley というのがあります。
// Volleyのインスタンス作成
RequestQueue mQueue = Volley.newRequestQueue(context);
// リクエスト生成
JsonObjectRequest request = new JsonObjectRequest(...)
// リクエストをキューに挿入
mQueue.add(request);
// リクエスト開始
mQueue.start();
という流れで、バックグランドでいい感じにリクエストを開始してくれるんですが、複数同時に実行する場合たまに通信が完了せずに失敗してしまうケースが。
よくよく調べてみると、最後の mQueue.start();
が問題。
イメージとしては、キューに add
して start
を呼び出して通信開始という流れかと思いきや、add
の時点で通信はもう開始されている。
start()のソースを読んでみると
public void start() {
stop(); // Make sure any currently running dispatchers are stopped.
...
}
先頭でいきなり stop してました。
つまり、複数同時に通信をした時に、タイミングによっては通信途中のものをstopしてしまうという事態に。
ということで、何か明示的に通信開始したい場合以外は start()
しないようにしよう。
ちなみに某しかさん曰く、現在Android界隈では Retrofit が主流とのこと。
http://square.github.io/retrofit/
参考
http://stackoverflow.com/questions/31158858/random-com-android-volley-noconnection-error-java-io-interruptedioexception-st
http://qiita.com/ueno-yuhei/items/d81dc638951ce3f6988a