2013年4月26日金曜日

[Android] Toastを自分で作ったThreadから表示させる


Toastを自分で作ったThreadから表示させようと思ったらエラーになった。
{まあ、UI Threadじゃないしな}
と思い、ググってみると、そういうわけでもなくLooperなるオブジェクトがあればいいらしい、その辺りの素晴らしい解説が、下のページ

  【Android】 UIスレッドとは別スレッドからのToastの表示

にあって通常そこで終了なのだけど、Looperを取得するために作るHandlerThreadをstart()させた後、quit()するうまいタイミングがないなあと思っていた。
ところが、ApplicationクラスにgetMainLooper()なんてのを見つけたので、使ってみたらうまくいったのでメモ。

Applicationを取得するのには、Activity.getApplication()があるが、今回は違うクラスから別スレッドで動かしたかったので、以下のようにした。

public class MyApplication extends Application {
  static private MyApplication _app;

  @Override
  public void onCreate() {
    super.onCreate();
    _app = this;
  }

  static public MyApplication getApplication() {
    return _app;
  }
}

これを使って、好きなスレッドから、下の関数を呼んで表示成功。

private void displayToast(final String msg) {
  Handler h = new Handler(MyApplication.getApplication().getMainLooper());
  h.post(new Runnable() {
    @Override
    public void run() {
      Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
  });
}