Android Toast cancel和show 不踩中不会知道的坑

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

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

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

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

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

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

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

4、别人封装的一个列子,介绍了Toast其他的一些问题网址:yii666.com<文章来源地址:https://www.yii666.com/article/332492.html


下面看下上面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方法 (容易踩坑的地方)文章来源地址https://www.yii666.com/article/332492.html

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给覆盖了,所以不生效,看了下源码也没具体看出来文章地址https://www.yii666.com/article/332492.html

/**
* 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网址:yii666.com

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

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

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

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

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~作者: QQ音乐技术团队题记Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用。但是,伴随着我们开发的深入,Toast 的问题也逐渐暴露出来。 本系列文章将分成两篇

  2. Android Toast cancel和show 不踩中不会知道的坑

    说到Android Toast,几乎都很熟悉吧,下面讲讲怎么实现下面几种场景:1、连续点击一个按钮,每次都产生一个新的Toast并且调用show方法问题:触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失2、连续点击一个按钮,缓存一个Toast,每次都调用show方法推荐:这

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

    Android Toast 封装,避免Toast消息覆盖,无阻塞,等强大功能 ?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913

  4. Android Toast效果

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

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

    http://blog.csdn.net/wangfayinn/article/details/8065763Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失。信息可以是简单的文本,也可以是复杂的图片及其他内容(显示一个view)。1.简单用法Toast.makeText(midlet.getApplicationContext(), \\\"用户名不能为空\\\", Toast.LENGTH_L

  6. Unity干中学——如何实现类似Windows Store 应用程序和Android Toast的通知?

    要实现通知中心功能,首先要创建一个游戏物体,在上面挂载GUITeture和GUIText脚本。注意GUITexture和GUIText脚本的顺序,GUITexture在前,GUIText在后,否则GUITexture会将GUIText遮挡住。接着设置Position属性,讲Position的X属性设置为1.2,Y设置为0.9,这样就将物体设置为屏幕之外靠近右上角

  7. robotframework + appium 获取android toast

    android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,\\\'记同步\\\')]  ,该xpath 表示为toast信息含有  \\\"记同步\\\",如toast弹出”笔记同步成功” 就能获取到这个toast,获取到toast 元素,就能获取完整文字,如图robot frame work ride 中的代码如下,示例代码为有道云添

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png