AsyncTaskLoaderは、Android 3から導入された新しい非同期処理クラス・・・。
AsyncTaskLoader | Android Developers
近年、こちらのほうが推奨されているので、前回の非同期処理をこれで書いてみる・・・。
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にある結果文字列をセットできる・・・。
今回はこれは使わない・・・。
でButton1を押して、10秒待つと、
変わった・・・。
AsyncTaskと違うのは、UIの更新がMainActivity側で書けるようになったことである・・・。
これで、CustomAsyncTaskLoaderは非同期処理だけとなり、すっきりした・・・。