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");
运行后的效果:
使用这种改进方法后,不管用户再怎么重复点击,也不会出现之前那种情况了,而且也避免了重复创建对象对资源内存的损耗