アンドロイドのアプリを作るにあたって、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 でもデフォルト設定でオーバーライドしてくれるのが、救い!?
最小手順
URL.openConnection()
を呼んでnew HttpURLConnection
を得る。結果をHttpURLConnection
にキャスト。getInputStream()
でレスポンスを読む。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 の読み込みはこちら。
コメントを残す