LoginSignup
4
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-06

はじめに

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3