データをネットワークからダウンロードするなどの時間のかかる処理を行う場合、メインスレッドで行うのではなく別スレッドで非同期に処理するというは避けて通れないものです。
そんな非同期処理を行なう為、Android には AsyncTaskクラス と AsyncTaskLoaderクラスというのが存在しますが、可能な限り AsyncTaskLoaderクラス を使うべきだろうと思っています。
AsyncTaskLoaderを使うべき理由をまとめてみます。
Activityのライフサイクルに対する問題
何か非同期で処理をする時多くの場合は、Activity (もしくはFragment) から非同期の処理を開始し、処理が終了したら結果をActivityで受け取るという流れになると思います。
では、非同期処理が終了する前にActivityが破棄されたらどうなるでしょう?
Activityが単純に閉じられただけならそれほど問題ないかもしれません。非同期処理の結果を受け取る必要はないので Activityの onDestroy() などに非同期処理をキャンセルさせるコードを書けばそれで良さそうです。
Activityの破棄は意外と頻繁に起こる可能性があります。
例えば端末を傾けて画面が縦から横へ回転した場合。
それまで縦画面だったActivityは破棄され横場面のActivityが再作成されます。
非同期処理中に画面が回転したらどうなるでしょう?
縦画面Activityの破棄と共に非同期処理を一度中断し、横画面Activityが作成されたらもう一度最初から非同期処理を開始するというのはあまりいい方法とは言えません。
(非同期処理がサーバーと通信しデータを登録するようなケースでは重複して登録するような事態になりかねません)
縦画面Activityの破棄されても非同期処理を続け、横画面Activityが作成された後こちらへ結果を戻すのがスマートだと考えるのではないでしょうか。
ライフサイクルに対応したのがAsyncTaskLoader
上記のような問題に対処する事が出来るのが AcyncTaskLoaderクラスです。
AsyncTaskLoader は LoaderManagerクラスによって管理されます。
LoaderManager は Activity 毎にインスタンスを持ちますが、回転などで再作成された場合にはインスタンスは引き継がれます。
つまり、縦画面Activityで作成したAsyncTaskLoaderを横画面Activityから参照する事が可能になります。
画面回転以外にもActivityが再作成されるケースはあるので、回転させなければいいって話でもありません。AsyncTaskLoaderを使ってしっかり対応しておくべきでしょう。
次回はこのAsyncTaskLoaderの使い方を解説していきます。
コメントをお書きください