読者です 読者をやめる 読者になる 読者になる

AsyncTask

前回までの、ワーカースレッドに重い処理を任せて、終わったら通知してもらうような処理を非同期処理という・・・。
ThreadとHandlerを使ったパターンは一番基本的なものだが、少々複雑なことをしようとするとこれらでは大変・・・

AsyncTask | Android Developers

AsyncTaskはより簡単に高度な非同期処理を実行するクラス・・・。

button1の上にtextview1を追加・・・。

textview1_textは"TextView1"・・・。

f:id:BG1:20161005182204p:plain

AsyncTaskの派生クラスCustomAsyncTaskを追加・・・。

Contextオブジェクトcontextをメンバに定義・・・。
コンストラクタで引数としてもらう・・・。
CustomAsyncTaskはAsyncTaskを継承・・・。
(ジェネリクスについてはJavaで扱う予定・・・。)
1つ目のIntegerは非同期処理に渡されるパラメータ配列の各要素型がIntegerであることを指す・・・。
2つ目は進捗状況を表すパラメータの型でIntegerとしているのだが今回は使わない・・・。
3つ目は非同期処理の戻り値がStringということ・・・。
この辺は行いたい処理のタイプに合わせて変える・・・。

doInBackgroundが非同期処理本体・・・。
10秒休止した後に、int型配列paramsの要素数が1つでもあれば、params[0]の値を示す文字列を生成する・・・。
できたString型文字列retを返す・・・。

onPostExecuteは、UIの更新に使う・・・。
渡されるcontextの正体はActivityなので、activityにキャスト・・・。
textview1を取得したらsetTextで非同期処理の結果resultの文字列をセット・・・。
onPostExecuteはUIスレッドで動くので問題なく更新される・・・。

MainActivityは、

button1のonClick時にCustomAsyncTaskの生成時にコンストラクタにthisを渡す・・・。
thisはMainActivity自身なので、CustomAsyncTask内でcontextとして保持し続け、使いたいときにActivityにキャストできる・・・。
task.executeにパラメータ10を渡す・・・。

f:id:BG1:20161005183454p:plain

Button1を押して10秒経つと、

f:id:BG1:20161005183602p:plain

"TextView1"が、"params[0] = 10"に変わった・・・。

Sample/android/AsyncTask/AsyncTask/src/AsyncTask at master · bg1bgst333/Sample · GitHub