-
Notifications
You must be signed in to change notification settings - Fork 355
2.09. ネットワーク通信
この章では、ネットワーク通信について解説します。
Androidのネットワーク通信のモジュールはHttpURLConnectionとHttpClientがあります。
どちらのモジュールも出来る事に大きな差はありません。そのためアプリケーション内ではどちらかに統一するのが一般的です。 現在、新しくアプリケーションを作成するならばHttpURLConnectionの使用を推奨します。 しかし、Android2.1をサポート端末に含める場合はHttpClientの使用が推奨されます。
サポートする範囲によって推奨するモジュールが変わってしまうのはわかりづらいですが、理由についてはこちらを参照してください。
ネットワークアクセスを行うためにはAndroidManifestファイルにネットワークアクセスを許可するパーミッションを追記する必要があります。 このパーミッションがない場合には、ネットワーク接続がエラーとなります。
<uses-permission android:name="android.permission.INTERNET" />
また、ネットワークの接続状態を確認するためには
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
のパーミッションが必要になります。 このパーミッションを取得することで Wifiまたは3Gなどのネットワーク接続が可能な場合は通信を行い、接続が不可能な場合はオフラインモードでアプリケーションを動作させる。 と言ったようなことが可能になります。
ネットワーク接続の処理は予測不能な遅延を含む可能性があるため、ネットワーク接続の処理はUIThreadで処理を行なってはいけません。 そのため、ネットワーク接続は基本的に前章の非同期処理と組み合わせて使うことになります。
参考:HttpURLConnection | Android Developers
HttpURLConnectionはweb上でデータの送受信をするためのモジュールです。
- URLオブジェクトのopenConnection()を呼び出すことによりインスタンスを取得出来ます。 ただし、openConnection()で取得できる型はURLConnection型なので、HttpURLConnectionへキャストする必要があります。
- 次に、必要なヘッダーを設定します。 Session cookieや認証情報、Content-typeなどを必要に応じて設定します。
- リクエストにbodyを設定する場合は、setDoOutput(true)でbodyが存在することを明示的に指定してください。 接続を確立後、getOutputStream()で取得したOutputStreamにbodyの内容を書き込みます。
- connect()で接続を確立します。 setDoOutput(false)の場合はこの段階でgetInputStream()でレスポンスを取得できるかと思います。 setDoOutput(treu)の場合は、getOutputStream()で取得したOutputStreamをcloseするまでデータの送信中のステータスになっているため、OutputStreamへの書き込みが完了したらcloseを呼び出すようにしてください。
- レスポンスをgetInputStream()で取得する。
上記のような手順でサーバーからのレスポンスを得ることができます。 ただし、実際にはgetInputStreamの前にgetResponseCode()でステータスコードなどを確認し、必要に応じてエラーハンドリングなどを行う必要があります。また、実際のアプリケーションでは、HttpURLConnectionをラッピングするクラスを作成し、個々のリクエストはラッパーを経由して行うと良いでしょう。
GET処理
URL url = new URL("http://mixi.jp");
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream is = connection.getInputStream();
StringBuilder src = new StringBuilder();
while (true) {
byte[] line = new byte[1024];
int size = is.read(line);
if (size <= 0)
break;
src.append(new String(line, "euc-jp"));
}
} catch (IOException e) {
e.printStackTrace();
} finally{
connection.disconnect();
}
POST処理
URL url = new URL("http://mixi.jp");
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
String postData = "hoge=fuga&piyo=test";
OutputStream os = connection.getOutputStream();
os.write(postData.getBytes());
os.flush();
os.close();
InputStream is = connection.getInputStream();
StringBuilder src = new StringBuilder();
while (true) {
byte[] line = new byte[1024];
int size = is.read(line);
if (size <= 0)
break;
src.append(new String(line, "euc-jp"));
}
} catch (IOException e) {
e.printStackTrace();
} finally{
connection.disconnect();
}
Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.