说到Android Toast,几乎都很熟悉吧,下面讲讲怎么实现下面几种场景:

1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法

  问题:触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失

2、连续点击一个按钮,缓存一个Toast,每次都调用show方法

  推荐:这种方式体验感觉最好,Toast消失的计时会从最后一次show之后才开始计算,还可以通过setText设置不同的内容

3、连续点击一个按钮,缓存一个Toast,每次先调用cancel再调用show方法

  问题:这里有坑,可能cancel之后就show不出来了

4、别人封装的一个列子,介绍了Toast其他的一些问题


下面看下上面1-3种方式的代码写法:

1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法,这个没什么好说的,都会写

Toast.makeText(context, "要显示的提示", Toast.LENGTH_LONG).show();

2、连续点击一个按钮,缓存一个Toast,每次都调用show方法(推荐写法,体验比较好)

 private Toast mShowingToast;
private void showTestToast() {
// mActivity是一个Activity对象,弹Toast一般用Activity类型的Context
if (mShowingToast == null) {
mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG);
}
mShowingToast.show();
}

3、连续点击一个按钮,缓存一个Toast,每次先调用cancel再调用show方法 (容易踩坑的地方)

private Toast mShowingToast;
private void showTestToast() {
// mActivity是一个Activity对象,弹Toast一般用Activity类型的Context
if (mShowingToast == null) {
mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG);
}
mShowingToast.cancel();
mShowingToast.show();
// 会发现cancel之后调用show是show不出来的
}

上面这种方式会发现Toast显示不出来,改下写法也许读者能猜到为什么

private Toast mShowingToast;
// 主线程的Handler对象
private Handler mHandler = new Handler(Looper.getMainLooper());
private void showTestToast() {
// mActivity是一个Activity对象,弹Toast一般用Activity类型的Context
if (mShowingToast == null) {
mShowingToast = Toast.makeText(mActivity, "要显示的提示", Toast.LENGTH_LONG);
}
mShowingToast.cancel();
mHandler.postDelayed(
new Runnable() {
@Override
public void run() {
mShowingToast.show(); // 会发现延迟之后就显示出来了
}
}, 200
); // 这个时间是自己拍脑袋写的,不影响体验就好,试过使用post也不行
}

为什么呢?可能是同步异步的问题,有可能show操作被后续执行的cancel给覆盖了,所以不生效,看了下源码也没具体看出来

/**
* Show the view for the specified duration.
*/
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
} INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;
tn.mNextView = mNextView; try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
} /**
* Close the view if it's showing, or don't show it if it isn't showing yet.
* You do not normally have to call this. Normally view will disappear on its own
* after the appropriate duration.
*/
public void cancel() {
mTN.hide(); try {
getService().cancelToast(mContext.getPackageName(), mTN);
} catch (RemoteException e) {
// Empty
}
} 这是Toast内部内TN的一个方法 /**
* schedule handleHide into the right thread
*/
@Override
public void hide() {
if (localLOGV) Log.v(TAG, "HIDE: " + this);
mHandler.post(mHide);
}

如果有读者知道上述问题的原因,欢迎回帖

参考文章:

http://blog.csdn.net/goodding/article/details/8792628

http://blog.csdn.net/arui319/article/details/7022392

最新文章

  1. 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误
  2. js location对象
  3. Mysql 分区
  4. Jenkins搭建
  5. Git ~ 大杀器之一 远程仓库 ~ Git
  6. windows下ipython的tab补全,只需安装pyreadline即可.
  7. OWIN初探(转)
  8. hive 中遇到的正则
  9. laravel 控制器类DB类操作
  10. 小白的python之路11/14
  11. 《Kubernetes权威指南》——网络原理
  12. Centos6.8配置HTTPS
  13. Card Game Again CodeForces - 818E (双指针)
  14. break continue练习
  15. flask的session用法2
  16. js正则表达式test方法、exec方法与字符串search方法区别
  17. 启动Windows防火墙提示“0x8007042c"
  18. Android编程 高德地图 AMapLocationClientOption 类中 setWifiActiveScan过时
  19. 低于0.01%的极致Crash率是怎么做到的?
  20. 【转载】丑数humble numbers

热门文章

  1. jdk 配置环境变量 解决无法加载主类问题
  2. 安卓动态调试七种武器之孔雀翎 – Ida Pro
  3. Mina入门教程(二)----Spring4 集成Mina
  4. 学习设计模式第二十七 - GoF之外简单工厂模式
  5. 从Facebook跑来阿里的赵海平大叔,你要干啥?
  6. Microsoft Azure Web Sites应用与实践【1】—— 打造你的第一个Microsoft Azure Website
  7. [LeetCode] Interleaving String - 交织的字符串
  8. C语言 · 十六进制转十进制
  9. JSON Web Token实际应用
  10. Python 学习之路 (前言)