IntentServiceでToastを使うと消えなくなる問題に対処する

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

IntentServiceを継承したクラスのonHandleIntentメソッドの中でToastを表示させたところ、
Toastが消えずに、ずっと表示された状態になりました。

アプリを強制終了すると消えるのですが、これでは困るので対処します。

原因

IntentServiceToastを表示した直後に役目を終えたのが原因でした。

つまり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();
  }
}

DisplayToastIntentServiceから使えます。
これで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.さんによるものです。深く感謝します。