非UIスレッドでのToast表示メモ

2021.2.1 Coskx Lab  

1 はじめに

非UIスレッドでToastを表示したい。

2 非UIスレッドでToastを表示

UIスレッドでToastを表示するときは
Toast.makeText(mContext, "Hello from Toast", Toast.LENGTH_LONG).show();
あるいは,strings.xmlに登録しておいた文字列なら
Toast.makeText(mContext, R.string.hello, Toast.LENGTH_LONG).show();
で表示できます。
しかし,非UIスレッドでToastを表示するときは,
import android.os.Handler;
のもとで

Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.post(new Runnable() {
    @Override
    public void run() {
        // Toast表示;
        Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
    }
});

または

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // Toast表示;
        Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
    }
});

でできます。ただし,mContextは事前にgetMainContext()などで用意しておいてください。
なお時間をずらして実行したい場合は

Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Toast表示;
        Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
    }
}, 300);    //0.3秒後に表示する

または

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
    @Override
    public void run() {
        // Toast表示;
        Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
    }
}, 300);    //0.3秒後に表示する

でできます。

3 非UIスレッドでToastを表示する便利クラス

SimpleToast.javaのダウンロード

SimpleToastは非UIスレッドからToastを表示する便利クラスです。

使用方法
このクラスのインスタンスを作成してから,Toast表示を要求するように使います。

SimpleToast mSimpleToast;

UIスレッドで使用されるContext mContextが決定してからインスタンスを作成します。
mSimpleToast = new SimpleToast(mContext);

Toast表示を要求する方法は2つあります。
(1)ダイレクト 通常のToastと同じように使います。
続けて要求するとキューに入って,順に表示されます。
mSimpleToast.displaySimpleToast_direct("Hello!",Toast.LENGTH_LONG);
または
mSimpleToast.displaySimpleToast_direct(R.string.hello,Toast.LENGTH_LONG);

(2)排他的に表示するときに使います。
前の表示が残っていると表示要求は無視されます。
mSimpleToast.displaySimpleToast("Hello!",Toast.LENGTH_LONG);
または
mSimpleToast.displaySimpleToast(R.string.hello,Toast.LENGTH_LONG);
キャンセルができるので,表示要求直前にキャンセル要求すれば,前の表示を消して,新しい表示を行います。
このキャンセルは,displaySimpleToastに対してだけ効果があります。
mSimpleToast.cancelSimpleToast();



補足 λ式

λ式を使うと定型のHandlerのコーディングが簡単になります。 通常のコーディング

Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Toast表示;
        Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
    }
}, 300);    //0.3秒後に表示する

λ式を使ったコーディング

Handler mHandler = new Handler(Looper.getMainLooper());
mHandler.postDelayed(() -> {
    // Toast表示;
    Toast.makeText(mContext,"Hello!", Toast.LENGTH_LONG).show();
}, 300);    //0.3秒後に表示する