Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
60
Help us understand the problem. What is going on with this article?
@yasumodev

AndroidでHTTP通信(GETリクエスト)

More than 5 years have passed since last update.

AndroidでHTTP通信(GETリクエスト)する2つのメジャーな(?)方法をまとめてみました。例として、天気予報のURLにアクセスしてXMLデータを取得します(解析はしない)。

1)DefaultHttpClient
2)HttpURLConnection

churippu_s.png1)DefaultHttpClient

TestActivity.java
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();
    }
}

yotsuba_s.jpg1)解説

new Thread() を使って、別スレッドでHTTP通信している理由は、そうしないと android.os.NetworkOnMainThreadException エラーが発生するためです。Android 3.0 以降、メインスレッドからはHTTPアクセスできなくなったようです。それ以外、特に難しいことはしておらず、ソースの通りです。

余談ですが、別スレッドから直接的にUI操作(TextViewなどにStringを表示など)はできないので、Handler.post() などを使う必要があります。

churippu_s.png2)HttpURLConnection

TestActivity.java
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();
    }
}

yotsuba_s.jpg2)解説

別スレッドでHTTP通信しているのは 1)と同じ理由です。InputStream から String へ変換するための静的関数を追加しています。そのぶん、コード量としては1)のほうがシンプルです。

churippu_s.png 参考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・ゞ いじょー。

60
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
yasumodev
「長い旅行に必要なのは大きなカバンじゃなく、口ずさめる一つの歌さ」スナフキン

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
60
Help us understand the problem. What is going on with this article?