AsyncTaskとBackgroundWorkerはちょっと違う
日頃、.NET FrameworkのBackgroundWorker
に慣れていたため、
AsyncTask
の説明をあまり読まずに使っていたんだけど、
AsyncTask#onPostExecute
と、
BackgroundWorker#OnRunWorkerCompleted
がちょっと違うっぽい。
違うと言っても、キャンセル時のお作法が異なる。
基本的にキャンセルされたかどうかチェックしながら処理をするのは共通で、
その後に呼ばれるメソッドがちょっと異なる。
BackgroundWorkerの場合
キャンセル時(BackgroundWorker#CancelAsync
が呼ばれた場合)は、
BackgroundWorker#RunWorkerCompleted
イベントの中で、
キャンセルされたかどうか判定する。
AsyncTaskの場合
キャンセル時(AsyncTask#cancel
が呼ばれた場合)は、onPostExecute
は呼ばれない。
その代わり、AsyncTask#onCancelled
が呼ばれる。
AsyncTask#cancel
の引数をtrue
を設定した場合は、
InterruptedException
が送出される。
これは、Thread#sleep
を叩き起こすのに使うみたいだけど、
自分の用途だとこれは利用しないので、
AsyncTask#cancel
の引数はfalse
で良さそう。
基本、AsyncTask#onCancelled
は、
onPostExecute
と同じくUIスレッドで呼び出されるので、
AsyncTask#isCancelled
を見て分岐する必要がなくなった代わりに、
どちらの場合でも行いたい処理は、どちらにも書く必要がある。
なんでこんなことを調べていたかというと、
AsyncTask#doInBackground
の中で使用しているBitmap
について、
安全にBitmap#recycle
を呼んで破棄したくて、
どうやって処理しようか悩んでいた。
もちろん前提条件として、
1秒も掛からないで終わるような処理ではあるんだけど、
Fragment#onDetach
で終了をポーリングするとか、
いくつか方法があると思われる。
モノクロに変換するだけならいんだけど、
今後は、もう少し処理を追加したいので、
処理の途中でキャンセルできた方が良いのかもね。
おしまい。
Leave a Comment