モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

Android における非同期 HTTP 通信

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2017/08/14
最終更新最終更新
2019/11/19
記事区分記事区分
一般公開

Android で利用される HTTP クライアントには VolleyOkHttp がありますが、ここでは 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>
Likeボタン(off)0
詳細設定を開く/閉じる
アカウント プロフィール画像

Android Developer

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • Spring Security フォームログインのサンプルコード
      Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
      えびちゃんえびちゃん11/4/2019に更新
      いいねアイコン画像0
    • 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]; となる。 初期化
      てんとうむしてんとうむし4/13/2018に更新
      いいねアイコン画像0
    • PlantUML による UML 図の描き方
      サムネイル画像-c788fffde5
      PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
      kentakenta12/21/2019に更新
      いいねアイコン画像0
    • Akka HTTP サンプルコード (Scala)
      サムネイル画像-a98142497c
      Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
      雄太雄太9/7/2021に更新
      いいねアイコン画像0
    • Kestrel の使用例
      Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
      したくんしたくん9/12/2017に更新
      いいねアイコン画像0