[Android] HttpURLConnection GET で画像をダウンロードする

ネットにHTTPアクセスしてデーターをダウンロードするためには、非同期のAsyncTaskを使い、HttpURLConnectionにて画像を落とします。
 

Android Studio 3.0.1
Android 8.0



HttpURLConnection

 
WebサーバとWebクライアント間でデータ送受信を行うために用いられるプロトコル(規約)をHTTPと言います。データの送受信にはGETとPOSTのメソッドがあり用途により使い分けます。
基本的には、両方とも送受信が可能
例えばGETでは画像が欲しいというリクエストを送信して画像データを受信する。POSTではデータベースの情報をサーバーに保存するために大量のデータを送るなど。以下は両者のザックリとした相違点

  • GET
    • サーバから情報を取得するケースに有効
    • データを送信できるのはテキストのみで少量しか送れない
    • https://www.google.co.jp/search?q=http+get&oq=http+get&aqs….のようにURLに付加して送信する
  • POST
    • サーバへ情報を登録するケース
    • バイナリーデータの送信
    • GETでのデータ送信限度を超えてしまう場合
    • 送信データをBODY部分に含めて送信できるので制限はない

今回はこのGETのメソッドを使って、サーバーから画像を受け取るケースを考えてみます。
 
Android6.0からApacheのHTTP Clientが基本的に使えなくなりました。Apache HTTP Client Removal
 

AsyncTask

 
何も考えずにネットにアクセスしてデーターをダウンロードしようとすると例外が出ます。
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1114)

非同期でアクセスしないといけません。
これは Android 3.0より前のバージョンではなかったのですが 3.0 以降で、メインスレッドでネットワーク処理を行うとエラーとなるように変わったようです。
 
基本的な考え方は非同期処理AsyncTaskの使い方にあります。
また付随してカスタムListenerも実装します。カスタム Listener を interface を使って実装してみる
 
AsyncTask<Params, Progress, Result>を継承したクラスを作ります。

  • Params: doInBackground() バックグラウンド処理の引数
  • Progress: 進捗度合いを表示したい時に使うパラメータ
  • Result: onPostExecute() 処理終了時に受け取る型

doInBackground(String… params)の
(String… params)は可変長引数といいます
呼出す側では任意の数の String を渡すことが可能
 
Listenerを使って作成しました。
 
MainActivity.java

 
AsyncTaskを実行するクラスです
DownloadTask.java

 
activity_main.xml

 
リソースです
strings.xml

 
マニフェストに INTERNET のパーミッションを入れるのを忘れずに
AndroidManifest.xml

 

 
 
関連ページ: