はじめに
IntentServiceを継承したクラスのonHandleIntentメソッドの中でToastを表示させたところ、
Toastが消えずに、ずっと表示された状態になりました。
アプリを強制終了すると消えるのですが、これでは困るので対処します。
原因
IntentServiceがToastを表示した直後に役目を終えたのが原因でした。
つまりToastを表示したUIスレッドが死んでしまったため、Toastを消せなくなったようです。
タイミングによっては、そもそもToastが表示できないケースもあるようです。
解決策
Toastの表示をRunnableに投げることによって回避できました。
まずはRunnableを実装したDisplayToastをこうします。
public class DisplayToast implements Runnable {
private final Context mContext;
String mText;
public DisplayToast(Context mContext, String text){
this.mContext = mContext;
mText = text;
}
public void run(){
Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
}
}
DisplayToastはIntentServiceから使えます。
これでToastが消える前にMyServiceが死んでも問題ありません。
public class MyService extends IntentService {
Handler mHandler;
public MyService(){
super("MyService");
mHandler = new Handler();
}
@Override
protected void onHandleIntent(Intent intent) {
mHandler.post(new DisplayToast(this, "Hello World!"));
}
}
このソースコードはstackoverflowで見つけたJim G.さんによるものです。深く感謝します。