RubotoでAsyncTaskを使おうとしてみたのだが、AsyncTaskを継承したクラスを作って使おうとしたらArgumentErrorになってしまい、試行錯誤したのですがよくわからなかったので、ThreadとHandlerを使って非同期処理を行うようにしてみた。
しかしこれもまた結構ハマった…。現状、非同期で動いたコードを載せておく。
import "android.os.Handler" import "java.lang.Runnable" import "java.lang.Thread" . . . # 何かしらの処理の呼出しなど def test @dialog.show # ProgressDialogを事前に作成しておく handler = android.os.Handler.new runnable = java.lang.Runnable.impl do # 通信処理などを行う handler.post(proc{ #ここで描画処理 @dialog.dismiss }) end java.lang.Thread.new(nil, runnable, "large_stack", 64 * 1024).start end
この書き方ならうまくいったのだが、最後のjava.lang.Thread.new(nil,runnable, …)のやつは、ruboto/util/stack.rbのThread.with_large_stackメソッドと同じ書き方をしている。なので、Thread.with_large_stack{ runnableに定義している処理 } でもうまく処理できるんじゃないか?と思ってそうしてみたが、エラーで落ちてしまった。
Rubyの無名関数の辺りのことはまだよくわかっていないので、ちょっとひとまずここまでとする。handler.send_messageからメッセージを送ってhandler.handle_messageで受け取って処理をしようとしたのだが、これもまた一切メッセージが届かなかった(試していた時からソースが変わったからやり方間違えていたかも)。handler.post方式にしたらうまくいった。
まさにヨチヨチ歩きのスピードであるが、とりあえず謎が少し解けてよかった。
AsyncTaskでやる方法とかもちゃんと知りたいなぁ。