[Android] AsyncTask を使わないとNetworkOnMainThreadException になります

android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1114)
 
ネットにアクセスしてデーターをダウンロードするとこの例外がでます。非同期でアクセスしないといけないのです。
 
これは android 3.0より前のバージョンではなかったのですがAndroid 3.0 以降で、メインスレッドでネットワーク処理を行うとエラーとなるように変わったようです。
 
また、Android6.0からAppcheのHTTP Clientが基本的に使えなくなりました。Apache HTTP Client Removal

ここでの情報はAppache HTTPClient ですので、Android6.0 以降は HttpURLConnection を使ってください。

 
画像ファイルへのURLを入力
ボタンをタップすると画像をダウンロードするサンプルを
作ってみます
(2015/6 Eclipse から Android Studio へ変更)
 
testdownload1
 

AsyncTask

 

AsyncTask の呼び出し

 
まずセオリー通りに非同期タスクを別クラスとして呼び出す方法です
MainActivity.java

 

AsyncTask クラス

 
MainActivity.java で呼ばれて非同期処理を行うクラス
AsyncDownload.java

 
AsyncTask<String, Integer, Bitmap> を継承したクラスを作っています
このジェネリックはそれぞれ
<Params、Progress、Result> を意味しています

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

doInBackground(String… params)の
(String… params)は可変長引数といいます
呼出す側では任意の数の String を渡すことが可能
 
activity_main.xml

 
マニフェストにINTERNETのパーミッションも忘れずに

 
次は、もう少し使いやすくコードを変えてみます
次のステップ >>>