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