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でやる方法とかもちゃんと知りたいなぁ。
