weblog

当サイトでは、アフィリエイト広告を利用しています。

Android HTTP通信でウェブサービスからJSONなどのデータをダウンロードしたい

アンドロイドのアプリを作るにあたって、web service などから json や xml などのデータを取ってきたい。だがしかし、URL をポンと投げるだけでもいくつも工程が存在する。それを比較的簡単にしてくれるのが volley というライブラリなのだが、API23 で削除された Apache HTTP Client を利用している。つまりそのままでは、開発が進まない。build.gradle の依存関係に

android {
    useLibrary 'org.apache.http.legacy'
}

を追加して使い続けてもいいのだが、メンテナンスがされてないことを考えるとね。。そこで、アンドロイドかグーグル謹製のものを使って作ってみようと考えた。

まずは、URL をポンと投げてみようと「android http」でググってみた。

HttpClient, AndroidHttpClient, DefaultHttpClient, HttpURLconnection, etc.

いっぱいありすぎ(泣)。

とはいえ、アパッチ系のクライアントは軒並み不採用なのでアンドロイド6.0での変更案内にあるように HttpURLConnection を使うことに。より効率的になってるそうだが、ざっくり説明文を見ただけだと大変そう。。URL が https でもデフォルト設定でオーバーライドしてくれるのが、救い!?

最小手順

  1. URL.openConnection() を呼んで new HttpURLConnection を得る。結果を HttpURLConnection にキャスト。
  2. getInputStream() でレスポンスを読む。
  3. disconnect() で閉じる。
try{
  // ココに web service の URL
  URL url = new URL("https://www.googleapis.com/books/v1/volumes?q=android");

  HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

  BufferedReader bufferedReader
    = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
  StringBuilder stringBuilder = new StringBuilder();

  String line = null;
  while ((line = bufferedReader.readLine()) != null){
    stringBuilder.append(line);
  }

  bufferedReader.close();
  urlConnection.disconnect();

  Log.d("http", stringBuilder.toString());
} catch (IOException e){
  e.printStackTrace();
  }

インプットストリームは、バッファされてないので BufferedReader でラップ。readLine() で読んだ一行毎を StringBuilder で一つの行にして Log へ出力。Android Monitor の logcat で debug に本文が表示されます。

ココで注意!

メインスレッドで http リクエストを投げると
android.os.NetworkOnMainThreadException が発生。とりあえずチェックするだけなら↓

new Thread(new Runnable() {
  @Override
  public void run() {
  // ココに上記 http リクエストを挿入
  }).start();

UI がフリーズしないよう非同期処理をするためには、 Loader  のサブクラス AsyncTaskLoader の使い方をどうぞ。JSON の読み込みはこちら。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

“Android HTTP通信でウェブサービスからJSONなどのデータをダウンロードしたい” への1件のコメント

  1. […] そんなわけで HTTP 通信で JSON をゲットしたあと、特定のデータのみ利用するなら org.json.JSONObject を。全データをパースするようなら GSON などのライブラリを使うのがよろしいかと。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください