【Android開発】AsyncTaskLoaderをAsyncTaskのように実装するには

ViewPagerを用いたフラグメント切替を実装したいと思い、FragmentActivityを使い始めました。
それに伴い、バックグラウンド処理をAsyncTaskからAsyncTaskLoaderに統一しようと思い、色々試していました。
そこに思いもよらぬ罠にハマってしまいましたので、自作アプリのJpopPVを元に、Android開発時に解決出来なかった事象の解決方法を記載したいと思います。

AsyncTaskからAsyncTaskLoaderに切替るきっかけについて

個人的にはAsyncTaskの方がシンプルで好きなのですが、ViewPagerを用いたフラグメント切替にて非アクティブのフラグメント処理時、AsyncTaskからのコールバック処理にてGUI処理を行うと、ViewRootのチェック処理にてアプリが落ちる現象に悩まされました。
AsyncTaskのonPostExecuteメソッドはUIスレッドで実行されるのが保証されているとリファレンスに書かれているのに、、、と思いながらも、AsyncTaskLoaderのonLoadFinishedにて同じ処理を行うと問題無くGUIに反映してくれました。
この違いにより、AsyncTaskからAsyncTaskLoaderへの切替を行わなければいけない(自分のコーディングが悪い?)と感じました。

AsyncTaskの良い点・悪い点

■良い点
・AsyncTaskを継承した独自クラスの内部インターフェースを呼び出し元が実装した場合、コードがシンプルとなる
・キャンセル有無確認(何かバグがあるとネットでは書かれていますが)がクラス設計にて実装済み
・プログレスバー等で進捗表示処理がクラス設計にて実装済み

■悪い点
・onPostExecuteはUIスレッド保証じゃない?

AsyncTaskLoaderの良い点・悪い点

■良い点
正直あまり感じません。

■悪い点
・キャンセル有無確認は独自に実装しなければいけない
・プログレスバー等で進捗表示を行う場合、独自に実装しなければいけない
・レジューム処理が便利かと思いましたが、私には不要
・ネットにも情報があまりない(これが一番辛かったです)
・LoaderCallbacksが一つのデータ型のみしか結果を返せないのでかなり不便

この内容だけ見ると、完全にAsyncTaskLoaderのメリットがありませんね、、、

AsyncTaskLoaderをAsyncTaskのように実装した内容

ここからはタイトルにあるように、AsyncTaskと同様な動きをするAsyncTaskLoaderの実装例を記載していきます。
自作アプリのJpopPVの画面
JpopPV_movie_read_001
をどのように実装したかで記載していきます。

■クラス設計の前提
・AsyncTaskLoaderのレジューム機能は使用しない
 レジューム機能を実装しないという事は、バックグラウンド処理結果に変更が無い場合でも常に新規実行という事とします。
 例 : ネットの画像を取得し、画像に変更が無いにも関わらず、毎回取得していく等
・AsyncTaskLoaderのonStopLoading、onReset、ではキャンセル処理を行う
・呼び出し元に結果を返す際は、独自インターフェース経由で結果を返す

■AsyncTaskで実装していた内容
まずはAsyncTaskで処理を行っていた時のメソッド一覧を画像で見て頂きます。

メソッド一覧にあるように、onPostExecuteにて呼び出し元が実装しているコールバックメソッドを呼び出しています。
次に、バックグラウンド処理フローを画像で見て頂きます。

■AsyncTaskLoaderで実装した内容
ほぼ同じように実装したかったのですが、なかなか情報が無いのに戸惑いました。
まずはメソッド一覧を画像で見て頂きます。

メソッド一覧に記載しているように、独自クラスにてAsyncTaskLoaderを継承し、LoaderCallbacksインターフェースも独自クラスにて実装しています。これにより、独自インターフェースを呼び出し元で実装してAsyncTaskと同様の動きを実現させました。
次に、バックグラウンド処理フローを画像で見て頂きます。

■実装に悩んだ点
進捗表示が元から設計されていない為、独自に実装する必要がありました。UIスレッドで実行される保証が無い為、Handlerにて処理をPOSTする形で実装出来たのでよしとしています。

この記事が参考となりましたら、JpopPVアプリのダウンロードとよろしければ以下の作業をして頂ければ幸いです。
・JpopPVアプリ評価で高評価
・JpopPVアプリ内の広告表示されている無料アプリのダウンロード(何度でも何回でもOKです)
今後も色々ブログ更新していきたいと思いますので、アプリ内でのこの動きはどう実装している?等ご質問頂ければブログ記事にしていきたいと思います。
よろしくお願いします。

Get it on Google Play


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*