HttpURLConnectionのdisconnect()を使うと他の通信が中断されてしまうことがあるので注意
AndroidでHTTPでデータをダウンロードしてこようとした。
2.09. ネットワーク通信 · mixi-inc/AndroidTraining Wiki · GitHubを参考に
private String downloadUrl(String urlString) { StringBuilder result = new StringBuilder(); HttpURLConnection urlConnection = null; try { URL url = new URL(urlString); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); while (true) { byte[] data = new byte[1024]; int size = inputStream.read(data); if (size <= 0) { break; } result.append(new String(data, "utf-8")); } } catch (IOException e) { e.printStackTrace(); } finally { urlConnection.disconnect(); } return result.toString(); }
こんなように関数を書いていた。(通信するAsyncTaskのdoInBackground()からこの関数を呼び出す)
一回通信するにはちゃんと動いていたのだが、
このような通信をするボタンを連打した時、片方の通信では内容が途中までしか取得できなかった。(Android 4.2のエミュレータ内)
HttpURLConnection (Java Platform SE 6)のjavadocによると
要求後、HttpURLConnection の InputStream または OutputStream 上で close() メソッドを呼び出すと、そのインスタンスに関連付けられていたネットワークリソースが解放される可能性がありますが、共有されている持続接続への影響はまったくありません。disconnect() メソッドを呼び出した場合、持続接続がその時点でアイドル状態になっていれば、使用していたソケットがクローズされる可能性があります。
と書いており、共有されている接続へ影響がないInputStreamのclose()メソッドを利用することでこの問題は解決できた
最終的に以下のようなソースコードにすることにした。
またAndroid公式のトレーニングConnecting to the Network | Android Developersにもそのように記述されている。
private String downloadUrl(String urlString) { StringBuilder result = new StringBuilder(); HttpURLConnection urlConnection = null; try { URL url = new URL(urlString); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); InputStream inputStream = urlConnection.getInputStream(); while (true) { byte[] data = new byte[1024]; int size = inputStream.read(data); if (size <= 0) { break; } result.append(new String(data, "utf-8")); } } catch (IOException e) { e.printStackTrace(); } finally { urlConnection.disconnect(); } return result.toString(); }
takam