Android で利用される HTTP クライアントには Volley や OkHttp がありますが、ここでは Android プラットフォームに標準で導入されている HttpsURLConnection (HttpURLConnection) を利用します。
また、Android では HTTP 通信を main スレッドではなくバックグラウンドの別スレッドで非同期に行う必要があり、IntentService や AsyncTaskLoader、あるいは RxJava といった選択肢がありますが、ここではやはり Android プラットフォームに標準で導入されている AsyncTask を利用します。
関連する公式ドキュメント
簡単な使い方
AndroidManifest.xml
android.permission.INTERNET
を追記してインターネット接続できるようにします。
...
<manifest... >
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
MainActivity.java
main (UI) スレッドで非同期処理の開始手続を行います。簡単のため onCreate()
内で実行しています。
package com.example.mycompany.myapp;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 非同期処理の実行
MyAsyncTask task = new MyAsyncTask(this);
task.execute("https://www.example.com");
// task.execute("https://www.example.com", "hi"); // POST の場合
Log.d(TAG, "created");
}
}
MyAsyncTask.java
別スレッドで HTTP GET リクエストを行っています。同じ MyAsyncTask クラスであっても、メソッドによって処理を担当するスレッドが異なることに注意します。
package com.example.mycompany.myapp;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
// POST の場合
// import java.io.BufferedWriter;
// import java.io.OutputStream;
// import java.io.OutputStreamWriter;
// doInBackground の引数の型: String
// publishProgress の引数の型: Void (今回は使用しません)
// doInBackground の返り値の型: String
public class MyAsyncTask extends AsyncTask<String, Void, String> {
// ロガーのタグ
private static final String TAG = "MyAsyncTask";
// UI スレッドから操作するビュー
private TextView textView;
public MyAsyncTask(Context context) {
// 本メソッドは UI スレッドで処理されます。
super();
MainActivity mainActivity = (MainActivity)context;
textView = (TextView)mainActivity.findViewById(R.id.myTextView);
}
@Override
protected String doInBackground(String... params) {
// 本メソッドは background 用のスレッドで処理されます。
// そのため、UI のビューを操作してはいけません。
// Java の文字列連結では StringBuilder を利用します。
StringBuilder sb = new StringBuilder();
// finally 内で利用するため try の前に宣言します。
InputStream inputStream = null;
HttpsURLConnection connection = null;
try {
// URL 文字列をセットします。
URL url = new URL(params[0]);
connection = (HttpsURLConnection)url.openConnection();
connection.setConnectTimeout(3000); // タイムアウト 3 秒
connection.setReadTimeout(3000);
// GET リクエストの実行
connection.setRequestMethod("GET");
connection.connect();
// // POST リクエストの実行
// connection.setRequestMethod("POST");
// connection.setRequestProperty("Content-Type", "text/plain");
// OutputStream outputStream = connection.getOutputStream();
// BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
// writer.write(params[1]);
// writer.close();
// connection.connect();
// レスポンスコードの確認します。
int responseCode = connection.getResponseCode();
if(responseCode != HttpsURLConnection.HTTP_OK) {
throw new IOException("HTTP responseCode: " + responseCode);
}
// 文字列化します。
inputStream = connection.getInputStream();
if(inputStream != null) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(connection != null) {
connection.disconnect();
}
}
return sb.toString();
}
@Override
protected void onPostExecute(String result) {
// 本メソッドは UI スレッドで処理されるため、ビューを操作できます。
Log.d(TAG, result);
textView.setText(result);
}
}
実行例です。main スレッドの Log が HTTP 通信の完了を待たずに出力されていることが確認できます。
08-15 00:14:24.201 24485-24485/com.example.mycompany.myapp D/MainActivity: created
08-15 00:14:25.539 24485-24485/com.example.mycompany.myapp D/MyAsyncTask: <!doctype html><html><head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 50px; background-color: #fff; border-radius: 1em; } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { body { background-color: #fff; } div { width: auto; margin: 0 auto; border-radius: 0; padding: 1em; } } </style> </head><body><div> <h1>Example Domain</h1> <p>This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.</p> <p><a href="http://www.iana.org/domains/example">More information...</a></p></div></body></html>
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...