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

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

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

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

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

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

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

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

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

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


下面看下上面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);
}

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

Android Toast cancel和show深入浅出实战相关推荐

  1. Android 5.x Theme 与 ToolBar 实战

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45303349:  本文出自:[张鸿洋的博客] 1.概述 随着Material ...

  2. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明

    http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...

  3. Android Toast 自定义显示时长

    Android Toast 只支持两种时间 LENGTH_SHORT 2 秒,LENGTH_LONG 3.5 秒,但是有场景需要自定义显示时长就会有问题,所以需要自定义实现,下边是自定义的类,通过定时 ...

  4. Android Toast类

    1. 默认创建 Toast是一种简易的消息提示框,toast提示框不能被用户点击,会根据用户设置的显示时间后自动消失. Toast静态方法makeText(),生成Toast实例,并调用show()方 ...

  5. 《Android传感器开发与智能设备案例实战》——导读

    本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的目录,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 ...

  6. [Android] Toast问题深度剖析(二)

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...

  7. 5G 时代的 Android App 开发入门与项目实战

    随着移动互联网的持续发展,Android系统从智能手机逐步拓展到平板电脑.智能电视.车载大屏.智能家居.智能手表等诸多设备,Android开发依然是前景可期的IT岗位. 当然,整个社会正在迈向5G时代 ...

  8. 《Android传感器开发与智能设备案例实战》——第2章,第2.4节安装ADT

    本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的第2章,第2.4节安装ADT,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  9. 《Android传感器开发与智能设备案例实战》——第1章,第1.2节Android的巨大优势...

    本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的第1章,第1.2节Android的巨大优势,作者 朱元波,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. 曝光原理_PS教程:双重曝光的原理及制作过程,魔术棒及调整边缘的简易抠图...
  2. Atitit.异步编程 java .net php python js 对照
  3. android文章链接
  4. 蓝桥练习题题解——作物杂交——Java
  5. P3957-跳房子【单调队列,dp,二分】
  6. 乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界
  7. SQL Server如何链接到 Oracle并查询其中的数据?并实现做接口
  8. Java经典实例:进阶版堆栈实现,支持任何对象类型
  9. 第2章 创建你的第一个 LISP 程序 Creating Your First Lisp Progr
  10. 人工智能在安全漏洞方面的应用_智慧消防平台的智慧在哪方面?
  11. Android应用程序键盘(Keyboard)消息处理机制分析(19)
  12. 【转】NSBundle的使用,注意mainBundle和Custom Bundle的区别
  13. Ruby on Rails快速创新性能的终极指南
  14. 论信贷企业信用评级与债券信用评级的关系
  15. redis哨兵集群、docker入门
  16. 微信应用签名配置方法
  17. 华硕ac86u文件服务器,数码教程资讯:华硕RT-AC86U路由器怎么设置FTP共享服务
  18. 使用Python+Pandas+Statsmodels建立线性回归模型预测房价
  19. html实现圆形计时器特效,如何用css3实现圆形倒计时
  20. 【图像处理】像素坐标系、像平面坐标系、相机坐标系、世界坐标系、内参矩阵、外参矩阵

热门文章

  1. Wordpress转移数据表后出现You do not have sufficient permissions to access this page的解决方法...
  2. 安装Oracle 11g报错 This is a prerequisite condition to test whether sufficient total swap space is avail
  3. 离散数学-图论知识总结(修改版)
  4. SPICE二极管直流分析原理
  5. iOS Developer:真机测试
  6. 采用html 的a标签,href连接为文件时无法下载解决方案
  7. 数字中国建设意义和面临的挑战
  8. java 保存file_java保存文件
  9. 网上购车平台上私户,不一样的上私户购车体验
  10. 一夜之间!京东市值涨350亿,拼多多涨550亿,阿里涨1400亿