2012-05-14
Scala で Android アプリ開発(AsyncTask 編)
ScalaでAndroidアプリ作成時、AsyncTaskの可変長引数メソッドが使えないことへの対策とサンプル ― Gist を丸パクリ。
Scala は、可変長引数を持つメソッドを上書きできないので、可変長引数を上書き済みの /path/to/hello-world/src/main/java/com/github/cooldaemon/HelloWorld/AsyncTask.java を作成する。
package com.github.cooldaemon.HelloWorld; public abstract class AsyncTask<Params, Progress, Result> extends android.os.AsyncTask<Params, Progress, Result> { @Override protected Result doInBackground(Params... params) { return doInBackground(params.length > 0 ? params[0] : null); } abstract protected Result doInBackground(Params param); @Override protected void onProgressUpdate(Progress... values) { onProgressUpdate(values.length > 0 ? values[0] : null); } protected void onProgressUpdate(Progress value) {} @SuppressWarnings({"unchecked"}) protected final void publishProgress(Progress value) { super.publishProgress(value); } }
用意した AsyncTask を継承して、別スレッドで処理したいタスクを記述する。
//可変長引数を使えない分は、case class で対応する case class FooParam(foo: String, bar: String) // AsyncTask から Activity を操作する(doInBackground は除く)ために Activity のインスタンスを渡しておく class FooTask(val activity: FooActivity) extends AsyncTask[FooParam, Int, Either[Throwable, Unit]] { override protected def onPreExecute() { // Activity に変化を加える。例えばダイアログの表示など } // doInBackground だけ別スレッドで動作する // doInBackground 内で publishProgress を使うと UI のスレッドに Int の値を送れる // 送った Int の値は onProgressUpdate で受け取れる override protected def doInBackground(param: FooParam): Either[Throwable, Unit] = { for { _ <- ham(param).right chick <- egg(param).right _ <- spam(param, chick).right } yield () } override protected def onProgressUpdate(progress: Int) { // プログレスの更新 } // AsyncTask の cancel メソッドを使用されると onCancelled が呼ばれる override protected def onCancelled() { // doInBackground の停止を促す。例えば doInBackground で参照しているフラグを onCancelled で更新するなど } override protected def onPostExecute(result: Either[HttpClientErrorResult, Unit]) { // Activity に変化を加える。例えばダイアログを消すなど } }
このコードは、画面の回転に対応していない。
画面が回転すると Activity のインスタンスは置き換えられるが AsyncTask は残り続けるので AsyncTask が保持する Activity のインスタンスを置き換える必要がある。
また、画面の回転と ProgressDialog を組み合わせる場合、画面回転後に ProgressDialog を再表示する必要があり、onCreateDialog に頼る事になる。
ProgressDialog を再表示する場合、以前の ProgressDialog 進行状況を引き継いだり、キャンセル処理を正常に動作させる必要があるので、なるべく画面が回転しないように固定しておいた方が良い。
もし、どうしても AsyncTask + ProgressDialog + 画面回転に対応したいのであれば、Activity から操作できる AsyncTask と ProgressDialog を管理する object を用意する。
この辺りは、ダウンローダ編で詳しく解説する。
トラックバック - http://d.hatena.ne.jp/cooldaemon/20120514/1336981252
リンク元
- 142 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CGAQFjAA&url=http://d.hatena.ne.jp/cooldaemon/20111017/1318862426&ei=7mywT6fVBNCamQXV3fjFCw&usg=AFQjCNEsCy4Y_RVvmjPnv3XUCwiWb_ienw&sig2=YwIygyR4WtZuDbxsAajSrg
- 90 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CL4GEBYwAQ&url=http://d.hatena.ne.jp/cooldaemon/20090329/1238333591&ei=zg2pT_OHIKikiAfxw7yWAw&usg=AFQjCNE6hw07pa0D4UtiUUUVPIkpg96AVA
- 64 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CGwQFjAC&url=http://d.hatena.ne.jp/cooldaemon/20110428/1303974324&ei=m7GwT9viF5GbmQWR1emsCQ&usg=AFQjCNHJMREb9BP045DgssFH0RBCy2cu_Q
- 46 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CIQBEBYwAw&url=http://d.hatena.ne.jp/cooldaemon/20120510/1336644845&ei=T_mwT6zTFqSimQWrv7mNCQ&usg=AFQjCNEUx7-2l8eElyFw6ZMiUAA7n6V-og&sig2=KPyELuSc3eMiKFWxHtD2lw
- 26 http://search.yahoo.co.jp/search?p=edoc 使い方&sp=1&rs=2&tid=top_ga1_sa&ei=UTF-8&oq=edoc&fr=top_ga1_sa&qrw=0
- 17 http://blog.dealforest.net/2012/03/ios-android-per-aes-crypt-connection/
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=4&ved=0CH8QFjAD&url=http://d.hatena.ne.jp/cooldaemon/20120514/1336981252&ei=2bmxT-kSiNiYBZPu5agJ&usg=AFQjCNFHGJX8XOa3cilFe8904FQww4nnFQ&sig2=M5QczZNz4yqq8LLtEyPnug
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CH4QFjAE&url=http://d.hatena.ne.jp/cooldaemon/20111017/1318862426&ei=IdmwT5TtMeXzmAWrjemxCQ&usg=AFQjCNEsCy4Y_RVvmjPnv3XUCwiWb_ienw&sig2=bfBBwHwB4Jldt41uUP1FVA
- 13 http://longurl.org
- 13 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CHAQFjAF&url=http://d.hatena.ne.jp/cooldaemon/20111017/1318862426&ei=UsSxT-DHBqTDmQW7iPCYCQ&usg=AFQjCNEsCy4Y_RVvmjPnv3XUCwiWb_ienw&sig2=wgL8-tDEyvLB_PbVcwJMZQ