说到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

Android Toast cancel和show 不踩中不会知道的坑的更多相关文章

  1. 2018-11-20-UWP-开发中,需要知道的1000个问题

    title author date CreateTime categories UWP 开发中,需要知道的1000个问题 lindexi 2018-11-20 09:28:53 +0800 2018- ...

  2. PHP中你应该知道的require()文件包含的正确用法

    以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(__FILE__)来拼凑文件路径,不知道这样做有什么好处,后来终于发现了其中的缘由. 我们来看一个简单的例子: 有a,b,c ...

  3. CLR中你想知道的事

    CLR是什么? CLR 公共语言运行时,是一个可由多个语言共同使用的运行环境,核心(内存管理,程序集加载,安全性,异常处理和多线程) Visual Studio是一种编译器,编译器也可称为语法检查器和 ...

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

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

  5. Android Toast的多功能封装——Android开发之路1

    Android封装实现各种功能的Toast GitHub地址:https://github.com/SibreiaDante/ToastUtils 效果图: 方法封装如下: showSingleton ...

  6. Android Toast 封装,避免Toast消息覆盖,替换系统Toast最好用的封装

    Android Toast 封装,避免Toast消息覆盖,无阻塞,等强大功能   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  7. Android Toast效果

    Android Toast效果是一种提醒方式,在程序中使用一些短小的信息通知用户,过一会儿会自动消失,实现如下: FirstActivity.java package org.elvalad.acti ...

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

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

  9. robotframework + appium 获取android toast

    android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')]  ,该xpath 表示为toast信息含有  "记 ...

随机推荐

  1. Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)

    环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...

  2. 公司内部培训SQL Server传统索引结构PPT分享

    公司内部培训SQL Server传统索引结构PPT分享 下载地址 http://files.cnblogs.com/files/lyhabc/SQLServer%E4%BC%A0%E7%BB%9F%E ...

  3. [ASP.NET MVC 小牛之路]18 - Web API

    Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的 ...

  4. SqlServer2008安装时提示重启计算机失败 解决办法

    问题描述: 在安装Sql Server 2008时提示重启计算机,重启之后不行,仍需要重启计算机. 如下图所示: 解决方法: 1.运行(或按键盘Win+R 组合键),输入regedit,调出注册表管理 ...

  5. spark参数调优

    摘要 1.num-executors 2.executor-memory 3.executor-cores 4.driver-memory 5.spark.default.parallelism 6. ...

  6. Bootstrap~学习笔记索引

    回到占占推荐博客索引 bootstrap已经用了有段时间了,感觉在使用上还是比较容易接受的,在开发人员用起来上,也还好,不用考虑它的兼容性,手机,平台,PC都可以有效的兼容. bootstrap官方a ...

  7. iOS—Xcode 7真机测试

    Xcode 7真机测试详解 1.准备 注意:一定要让你的真机设备的系统版本和app的系统版本想对应,如果不对应就会出现一个很常见的问题:could not find developer disk im ...

  8. jsdoc

    一.javascript注释规范 我们在编写javascript文件的时候,一般会添加一些注释.例如一些文件.类.方法和属性都应该用合适的标记和类型进行注释.这里不但方便我们的阅读,也能养成一个好的习 ...

  9. GitFlow

    git工作流 始终保持有master分支(只要有目录,git就自动创建)和develop分支(手动创建) 一.主分支Master二.开发分支Develop三.临时性分支(最后发布要删除的)* 功能(f ...

  10. 08. Web大前端时代之:HTML5+CSS3入门系列 ~ QQ空间时间轴

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 大前端系列,主要就是使用CSS3.0来实现,注释我已经打 ...