AndroidでHTTP通信(GETリクエスト)する2つのメジャーな(?)方法をまとめてみました。例として、天気予報のURLにアクセスしてXMLデータを取得します(解析はしない)。
1)DefaultHttpClient
2)HttpURLConnection
1)DefaultHttpClient
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
// HTTPボタン押下
public void onBtnHttpClicked(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpClient httpClient = new DefaultHttpClient();
// 大阪の天気予報XMLデータ
HttpGet httpGet = new HttpGet("http://www.drk7.jp/weather/xml/27.xml");
HttpResponse httpResponse = httpClient.execute(httpGet);
String str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
Log.d("HTTP", str);
} catch(Exception ex) {
System.out.println(ex);
}
}
}).start();
}
}
1)解説
new Thread()
を使って、別スレッドでHTTP通信している理由は、そうしないと android.os.NetworkOnMainThreadException
エラーが発生するためです。Android 3.0 以降、メインスレッドからはHTTPアクセスできなくなったようです。それ以外、特に難しいことはしておらず、ソースの通りです。
余談ですが、別スレッドから直接的にUI操作(TextViewなどにStringを表示など)はできないので、Handler.post()
などを使う必要があります。
2)HttpURLConnection
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class TestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
}
// HTTPボタン押下
public void onBtnHttpClicked(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// 大阪の天気予報XMLデータ
URL url = new URL("http://www.drk7.jp/weather/xml/27.xml");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
String str = InputStreamToString(con.getInputStream());
Log.d("HTTP", str);
} catch(Exception ex) {
System.out.println(ex);
}
}
}).start();
}
// InputStream -> String
static String InputStreamToString(InputStream is) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
br.close();
return sb.toString();
}
}
2)解説
別スレッドでHTTP通信しているのは 1)と同じ理由です。InputStream から String へ変換するための静的関数を追加しています。そのぶん、コード量としては1)のほうがシンプルです。
参考URL
Webからダウンロードして保存する DefaultHttpClientの使用例
http://pentan.info/java/sample/file_download.html
Android組込みのHttpComponent(HttpClient)の正しい使い方といくつかのtips
http://terurou.hateblo.jp/entry/20110702/1309541200
Android HTTPで通信する(HTTPUrlConnection)
http://qiita.com/kawa106/items/9f50537a36dfa31863c3
Androidの通信処理に何使えばいいのか分からないって話。
http://quesera2.hatenablog.jp/entry/2014/11/22/021741
Javaによる、String⇔InputStreamの相互変換
http://web.plus-idea.net/2012/10/java-string-inputstream/
メインスレッド(要は画面処理)でhttpリクエスト投げようとしたら怒られた。
〜NetworkOnMainThreadException〜
http://shirusu-ni-tarazu.hatenablog.jp/entry/2013/01/20/033030
気象庁の天気予報情報を XML で配信
http://www.drk7.jp/weather/
(・o・ゞ いじょー。