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

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

Android Studio 2.3.3
Android 7.1.1



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

 
基本的な考えたは非同期処理AsyncTaskの使い方にあります。
 
何も考えずにネットにアクセスしてデーターをダウンロードすると例外がでます。
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1114)
非同期でアクセスしないといけません。
 
これは android 3.0より前のバージョンではなかったのですがAndroid 3.0 以降で、メインスレッドでネットワーク処理を行うとエラーとなるように変わったようです。
 
基本的な考え方は非同期処理AsyncTaskの使い方にあります。
 
AsyncTask<Params, Progress, Result>を継承したクラスを作っています。このジェネリックの意味は

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

doInBackground(String… params)の
(String… params)は可変長引数といいます
呼出す側では任意の数の String を渡すことが可能
 
ここでは、非同期タスクを別クラスとした冗長的なやり方を少し変えてパラメータをfinalにして、AsyncTask<Void,Void,Void>とする方法でコードをすっきりさせます。
 
MainActivity.java

 
activity_main.xml

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

 
httpclient_3
 
 
関連ページ: