android Toast只显示一次

Toast在连续弹出显示时,只会显示第一次,后面要显示需要Toast.cancel()

 

public class ToastUtil {
    private static Toast mToast;
    private static Handler mHandler = new Handler(Looper.getMainLooper());
    private final static String THREAD_MAIN = "main";

    /**
     * 显示toast(可以子线程中使用Toast)-short
     *
     * @param msg Toast消息
     */
    @SuppressLint("ShowToast")
    public static void showShortToast(String msg) {
        try {
            // 判断是在子线程,还是主线程
            if (THREAD_MAIN.equals(Thread.currentThread().getName())) {
                if (mToast == null) {
                    mToast = Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_SHORT);
                } else {
                    mToast.cancel();
                    mToast = Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_SHORT);
                    mToast.setText(msg);
                }
                mToast.show();
            } else {
                // 子线程
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        } catch (WindowManager.BadTokenException e) {
            e.printStackTrace();
            CrashHandler.postCatchedException(e);
            //android API25系统BUG,TOAST异常
        }

    }

    /**
     * 显示toast(可以子线程中使用Toast)-short
     *
     * @param msg Toast消息
     */
    @SuppressLint("ShowToast")
    public static void showLongToast(String msg) {
        try {
            // 判断是在子线程,还是主线程
            if (THREAD_MAIN.equals(Thread.currentThread().getName())) {
                if (mToast == null) {
                    mToast = Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_LONG);
                } else {
                    mToast.cancel();
                    mToast = Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_LONG);
                    mToast.setText(msg);
                }
                mToast.show();
            } else {
                // 子线程
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(ContextApp.app(), msg, Toast.LENGTH_LONG).show();
                    }
                });
            }
        } catch (WindowManager.BadTokenException e) {
            e.printStackTrace();
            CrashHandler.postCatchedException(e);
            //android API25系统BUG,TOAST异常
        }

    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,可以使用 `Toast` 类实现简单的消息提示。默认情况下,`Toast` 的显示时间是 2 秒钟。如果需要自定义显示时间,可以使用 `setDuration(int duration)` 方法来设置。单位为毫秒。 例如,如果你需要将 `Toast` 的显示时间设置为 5 秒钟,代码如下: ``` Toast toast = Toast.makeText(getApplicationContext(), "Hello, world!", Toast.LENGTH_SHORT); toast.setDuration(5000); toast.show(); ``` 但是,如果你在第二次显示 `Toast` 的时候,还是使用了上述代码,那么就会出现显示时间不符合预期的情况。这是因为 `Toast` 是一个系统级别的组件,它的显示时间是受到限制的。在 Android 中,如果连续显示两个 `Toast`,第二个 `Toast` 的显示时间会被截断,只显示 1 秒钟左右。 为了解决这个问题,你可以考虑使用 `Handler` 或者 `Timer` 来实现延时显示。具体实现方式可以参考下面的示例代码: ``` private Toast mToast; private Handler mHandler = new Handler(); private void showToast(String message, int duration) { mHandler.removeCallbacksAndMessages(null); // 取消之前的定时任务 if (mToast != null) { mToast.cancel(); mToast = null; } mToast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT); mToast.setDuration(duration); mToast.show(); mHandler.postDelayed(new Runnable() { @Override public void run() { mToast.cancel(); mToast = null; } }, duration); } ``` 在上面的代码中,我们创建了一个 `Handler` 对象,用于处理延时任务。在 `showToast` 方法中,我们先取消之前的定时任务和 `Toast`,然后重新创建一个 `Toast` 并设置其显示时间。接着,我们使用 `Handler.postDelayed` 方法来延时取消 `Toast` 的显示。这样就可以避免连续显示两个 `Toast` 的时候,第二个 `Toast` 的显示时间被截断的情况了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值