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

AsyncTaskLoader

AsyncTaskLoaderは、Android 3から導入された新しい非同期処理クラス・・・。

AsyncTaskLoader | Android Developers

近年、こちらのほうが推奨されているので、前回の非同期処理をこれで書いてみる・・・。

f:id:BG1:20161006124303p:plain

AsyncTaskLoaderの派生クラスとしてCustomAsyncTaskLoaderを追加・・・。

AsyncTaskLoaderの後の"<~>"には、非同期処理の結果の型だけを指定する・・・。
文字列なのでString・・・。
contextとparamをメンバとして持っておく・・・。
paramは非同期処理時に渡される引数・・・。
コンストラクタでcontextとparamを各メンバに保持・・・。

非同期処理本体で、10秒経ったらparamを文字列retにして返す・・・。

Loaderの開始時にonStartLoadingが呼ばれる・・・。
ここでforceLoadを呼ぶことで非同期処理が走る・・・。
(ここはこういうものらしいぐらいの理解でいい・・・。)

MainActivity側で、

LoaderCallbacks<String>を実装しておく必要がある・・・。

Button1のonClick時にBundle型argsでparamをキーとして値10を登録し、getLoaderManager().initLoaderでローダを初期化・・・。
これが実質的にロードつまり非同期処理の開始になる・・・。
第1引数は複数の非同期処理を使う場合に識別するためのID・・・。今回はこれだけなので0・・・。
第2引数はargs・・・。
第3引数はthisを渡す・・・。

LoaderCallbacksのonCreateLoaderが呼ばれる・・・。
paramを取り出して、CustomAsyncTaskLoaderコンストラクタの第2引数に・・・。
そのあと、CustomAsyncTaskLoaderのonStartLoadingでforceLoadを経て、loadInBackgroundが実行される・・・。

終わったらonLoadFinished・・・。ここでUIの更新をする・・・。
ここはUiスレッドなので問題なくtextview1.setTextで第2引数のdataにある結果文字列をセットできる・・・。

今回はこれは使わない・・・。

f:id:BG1:20161006130624p:plain

でButton1を押して、10秒待つと、

f:id:BG1:20161006130638p:plain

変わった・・・。
AsyncTaskと違うのは、UIの更新がMainActivity側で書けるようになったことである・・・。
これで、CustomAsyncTaskLoaderは非同期処理だけとなり、すっきりした・・・。

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