はじめに
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.さんによるものです。深く感謝します。