Toast使用小技巧-防止重复创建

Toast是我们在Android开发中经常被使用到的
我们在创建Toast时,都是这么写:

Toast.makeText(context, "message", Toast.LENGTH_SHORT).show();

一般来说这样写是没有问题的,但是当用户多次连续触发Toast时,这样写的缺点就体现出来了:
这里写图片描述

多个Toast会排队等待显示,这样的用户体验非常差
不只是重复显示的问题,每调用一次makeText方法,就会new一个新的Toast对象,可以看看makeText的源码实现:

    /**
     * Make a standard toast that just contains a text view.
     *
     * @param context  The context to use.  Usually your {@link android.app.Application}
     *                 or {@link android.app.Activity} object.
     * @param text     The text to show.  Can be formatted text.
     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
     *                 {@link #LENGTH_LONG}
     *
     */
    public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
        // 每调用一次该方法,就会重新new一个Toast对象
        Toast result = new Toast(context);

        LayoutInflater inflate = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
        TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
        tv.setText(text);

        result.mNextView = v;
        result.mDuration = duration;

        return result;
    }

在开发中应该尽量避免重复new对象,所以我们对Toast进行改进,封装成一个工具类:

public class ToastUtil {

    private static Toast toast;

    /**
     * 显示Toast
     * @param context 上下文
     * @param content 要显示的内容
     */
    public static void showToast(Context context, String content) {
        if (toast == null) {
            toast = Toast.makeText(context, content, Toast.LENGTH_SHORT);
        } else {
            toast.setText(content);
        }
        toast.show();
    }

    /**
     * 显示Toast
     * @param context 上下文
     * @param resId 要显示的资源id
     */
    public static void showToast(Context context, int resId) {
        showToast(context, (String) context.getResources().getText(resId));
    }
}

当Toast为null时我们才调用makeText方法new一个Toast对象,当不为null时直接给它赋值就好了,这样就避免了重复创建对象和重复显示的问题
使用时直接调用:

ToastUtil.showToast(context, "message");

运行后的效果:
这里写图片描述

使用这种改进方法后,不管用户再怎么重复点击,也不会出现之前那种情况了,而且也避免了重复创建对象对资源内存的损耗

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值