Ruboto: 非同期処理を行う(Thread, Handler)

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


カテゴリー Android, Ruby | タグ | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です