Toastを自分で作ったThreadから表示させようと思ったらエラーになった。
{まあ、UI Threadじゃないしな}
と思い、ググってみると、そういうわけでもなくLooperなるオブジェクトがあればいいらしい、その辺りの素晴らしい解説が、下のページ
【Android】 UIスレッドとは別スレッドからのToastの表示
にあって通常そこで終了なのだけど、Looperを取得するために作るHandlerThreadをstart()させた後、quit()するうまいタイミングがないなあと思っていた。
ところが、ApplicationクラスにgetMainLooper()なんてのを見つけたので、使ってみたらうまくいったのでメモ。
Applicationを取得するのには、Activity.getApplication()があるが、今回は違うクラスから別スレッドで動かしたかったので、以下のようにした。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MyApplication extends Application { static private MyApplication _app; @Override public void onCreate() { super .onCreate(); _app = this ; } static public MyApplication getApplication() { return _app; } } |
これを使って、好きなスレッドから、下の関数を呼んで表示成功。
1 2 3 4 5 6 7 8 9 | 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(); } }); } |