Rubotoを使い、AndroidでAsyncTaskを使う

Androidで非同期処理を行うAsyncTaskがあったため、Rubotoでサンプルを作ってみたときのメモ。

■環境

Platform JDK ant Ruby ruboto jruby-jars Device API level
Windows7 x64 1.7.0_25 1.9.1 RubyInstaller 1.9.3-p448 0.13.0 1.7.4 Nexus7 2012 android-17

■生成

ruboto gen app --package com.example.async_task --target android-17 --with-jruby

■参考にしたところ

Java版の以下のソースを参考にしました。
[Android] AsyncTask による非同期処理 | rakuishi.com


また、Rubotoで実装していたものもいくつかあり、ハマりどころは以下が参考になりました。
なお、自分の場合 ruboto gen subclass は使わず、AsyncTaskを継承したMyTaskを使いました。
hilohiro/ruboto-sample-1 · GitHub


他に、ThreadとHandlerを使ったサンプルもありました。
Ruboto: 非同期処理を行う(Thread, Handler) | 自転車で通勤しましょ♪ブログ



■ソース

require 'ruboto/widget'
require 'ruboto/util/toast'

ruboto_import_widgets :Button, :LinearLayout, :TextView

java_import 'android.os.AsyncTask'
# Thread.sleepを使いたいため追加
java_import 'java.lang.Thread'


class AsyncTaskActivity
  attr_accessor :status

  def onCreate(bundle)
    super

    view = 
      linear_layout orientation: :vertical do
        @status = text_view text: 'before', text_size: 48
        button text: 'start', on_click_listener: MyClickListener.new(self)
      end

    self.content_view = view
  end
end


class MyClickListener
  def initialize(activity)
    @activity = activity
  end

  def onClick(view)
    task = MyTask.new
    task.add_activity(@activity)
    task.execute ''
  end
end


class MyTask < AsyncTask
  def add_activity(activity)
    @activity = activity
  end

  def doInBackground(params)
    Thread.sleep(1000)
    'after'
  end

  def onPostExecute(result)
    @activity.status.text = result
    @activity.toast 'done!'
  end
end


Gistにも上げておきました。
RubotoでのAsyncTaskサンプル