概要

アプリの処理を大きく分類すると
  • 描画処理
  • UI(ユーザインターフェース)などのイベント処理
  • データ処理(データの読み書き、演算)
があります。

これらの処理を滞りなく動かすことや、処理上関係のある部分について
同期をとることが必要となります。

例えば、次のようなケースが考えられます。
  • UIの操作に応じて画面部品の表示を更新する
  • データを読み込んで画面表示を行う
  • 時間のかかる処理をUI処理と平行して行う

Androidアプリは、「UIなどのイベント処理」と「描画」を1つのメインスレッドで処理します。
ただし1つのメインスレッドで処理する場合、次のような問題が発生します。
  • a)1ヶ所でも時間がかかる処理が入ると、全体の動きがとまってしまう
  • b)メインスレッド以外のスレッドからの描画方法が必要になる
a)1ヶ所でも時間がかかる処理が入ると、全体の動きがとまってしまう
  • UI部品ごとのイベント処理は、5秒以内
    • 5秒を越えると、エラーダイアログが表示される
b)メインスレッド以外のスレッドからの描画方法が必要になる
  • 別スレッドから描画処理を実行するとエラーが発生
    • メインスレッドを通じて処理する必要がある
  • スレッド間のメッセージ送信を行う仕組みの理解
    • android.osパッケージのLooperクラス、Handlerクラス、Messageクラスの理解が必要

AsyncTaskを使う

Androidで非同期処理を行うためには、「Handlerクラス」などを使う必要がありますが
AsyncTaskを使えば、それを意識することなく、容易にバックグラウンドで処理を行い
その結果をUIスレッドで表示することができます。

パラメータ

Params
処理の実行が開始される時に使用されます。doInBackground()メソッドの引数です。
Progress
バックグラウンド処理の進捗状況を表示するためのonProgressUpdate()メソッドの引数です。
Result
バックグラウンド処理が終了した時に使用されるonPostExecute()メソッドの引数です。

4つのメソッド

AsyncTaskは、次の4つのメソッドを順に使用し、実行することができます。
1.onPreExecute()
  • プログレスバーなどのUI部品の準備などに使用
2.doInBackground()
  • バックグラウンドで実行されるメソッド
  • AsyncTaskのexecute()メソッドの引数は、このメソッドに渡される
  • このメソッドの戻り値が、onPostExecute()に渡される
  • publishProgress()メソッドを使用することで、onProgressUpdate()を実行
3.onProgressUpdate()
  • UIスレッドで実行される
  • プログレスバーなどで進捗状況の更新を行う等に利用
4.onPostExecute()
  • doInBackground()の処理が終了すると、UIスレッドで実行される
  • doInBackground()の実行結果を引数として受け取る

実行時の注意

  • AsyncTaskのインスタンスは、UIスレッドで生成
  • AsyncTaskのexecute()メソッドは、UIスレッドで実行
  • onPreEcecute()、onPostExecute()、doInBackground()、onProgressUpdate()を手動で実行してはいけない
  • AsyncTaskは1回だけ実行可能
    • 同一インスタンスで2回目を実行すると例外が発生

サンプルコード

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }
実行方法
new DownloadFilesTask().execute(url1, url2, url3);

このページへのコメント

G5aPm4 Thanks-a-mundo for the blog article.Much thanks again. Will read on...

0
Posted by awesome things! 2014年01月23日(木) 13:15:20 返信

40qoTH <a href="http://jtydlhsbzzhs.com/">jtydlhsbzzhs</a>, [url=http://vznadsakdteg.com/]vznadsakdteg[/url], [link=http://yirhcxovtedd.com/]yirhcxovtedd[/link], http://ciwhefiqdeos.com/

0
Posted by qzbkaqige 2013年11月14日(木) 15:29:19 返信

CVDrLq <a href="http://fstaklfmqpys.com/">fstaklfmqpys</a>, [url=http://vtazowyktxsy.com/]vtazowyktxsy[/url], [link=http://paagplupsyre.com/]paagplupsyre[/link], http://creuwcawxozf.com/

0
Posted by ngashlym 2013年09月20日(金) 23:50:34
http://rwhsmkalqeuw.com/
返信

iYehiG <a href="http://yjyvlxbvufis.com/">yjyvlxbvufis</a>, [url=http://luiyvqyewtsd.com/]luiyvqyewtsd[/url], [link=http://bsqsnghmhdwn.com/]bsqsnghmhdwn[/link], http://tfleaibmcrzr.com/

0
Posted by btazogjdggc 2013年07月07日(日) 04:55:37
http://gyopdfrcibpq.com/
返信

zorw38 <a href="http://ufygkyuwciwl.com/">ufygkyuwciwl</a>, [url=http://kgmqgohsxdsx.com/]kgmqgohsxdsx[/url], [link=http://yxqbgjpwxyrn.com/]yxqbgjpwxyrn[/link], http://kbmzvnpfdnhk.com/

0
Posted by tuvxpqrt 2013年06月17日(月) 06:35:49
http://qdzufhceyijt.com/
返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます