Android中使用Toast.cancel()方法优化toast内容显示的解决方法

产品在测试过程中发现一个bug,就是测试人员不停的疯狂的点击某个按钮,触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失。这样可能会影响用户的使用。

看到Toast有一个cancel()方法:


复制代码 代码如下:

void cancel()
Close the view if it's showing, or don't show it if it isn't showing yet.

做程序员的,基本一看api就知道,用这个可以取消上一个toast的显示,然后显示下一个,这样就能解决出现的问题。可是在测试的过程中,发现却没有想象中的那么简单,不信可以百度一下,很多很多人发现toast的cancel()方法不起作用。还是不讲具体过程,只讲结果吧。

我把toast做成了一个应用类,方便使用,大家可以直接用:


复制代码 代码如下:

package com.arui.framework.android.util;

import android.content.Context; 
import android.os.Handler; 
import android.os.Looper; 
import android.widget.Toast;

复制代码 代码如下:

/**   
 * Toast util class.   
 *    
 * @author <A href="http://jb51.net">http://jb51.net</A>   
 * @version 2011/11/30   
 *    
 */  
public class ToastUtil {

private static Handler handler = new Handler(Looper.getMainLooper());

private static Toast toast = null;

private static Object synObj = new Object();

public static void showMessage(final Context act, final String msg) { 
        showMessage(act, msg, Toast.LENGTH_SHORT); 
    }

public static void showMessage(final Context act, final int msg) { 
        showMessage(act, msg, Toast.LENGTH_SHORT); 
    }

public static void showMessage(final Context act, final String msg, 
            final int len) { 
        new Thread(new Runnable() { 
            public void run() { 
                handler.post(new Runnable() { 
                    @Override 
                    public void run() { 
                        synchronized (synObj) { 
                            if (toast != null) { 
                                toast.cancel(); 
                                toast.setText(msg); 
                                toast.setDuration(len); 
                            } else { 
                                toast = Toast.makeText(act, msg, len); 
                            } 
                            toast.show(); 
                        } 
                    } 
                }); 
            } 
        }).start(); 
    }

public static void showMessage(final Context act, final int msg, 
            final int len) { 
        new Thread(new Runnable() { 
            public void run() { 
                handler.post(new Runnable() { 
                    @Override 
                    public void run() { 
                        synchronized (synObj) { 
                            if (toast != null) { 
                                toast.cancel(); 
                                toast.setText(msg); 
                                toast.setDuration(len); 
                            } else { 
                                toast = Toast.makeText(act, msg, len); 
                            } 
                            toast.show(); 
                        } 
                    } 
                }); 
            } 
        }).start(); 
    }

}

代码的逻辑很简单。这里加了同步,这样做可以确保每一个toast的内容至少可以显示出来,而不是还没显示就取消掉了。这样做,是因为toast的内容不一定完全相同,如果没显示出来,也会有问题。

时间: 2013-05-07

Android控件系列之Toast使用介绍

Toast英文含义是吐司,在Android中,它就像烘烤机里做好的吐司弹出来,并持续一小段时间后慢慢消失 Toast也是一个容器,可以包含各种View,并承载着它们显示. 使用场景: 1.需要提示用户,但又不需要用户点击"确定"或者"取消"按钮. 2.不影响现有Activity运行的简单提示. 用法: 1.可以通过构造函数初始化: 复制代码 代码如下: //初始化Toast Toast toast = new Toast(this); //设置显示时间,可以选择To

Android编程经典代码集锦(复制,粘贴,浏览器调用,Toast显示,自定义Dialog等)

本文实例总结了Android编程经典代码段.分享给大家供大家参考,具体如下: 1. 复制,粘贴 clip = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); clip.setText("copy"); // 复制 clip.getText(); // 粘贴 2.调用浏览器 核心代码如下: Intent intent = new Intent(); intent.setAction("android.

分享Android中Toast的自定义使用

1.Toast源码分析 老规矩,我们先去看Toast的源码. Toast有两种显示布局方式,一种最常见调用Toast.makeText()  ,看源码是这样写的 public static Toast makeText(Context context, CharSequence text, @Duration int duration) { Toast result = new Toast(context); LayoutInflater inflate = (LayoutInflater) c

如何解决android Toast重复显示

Toast是一种简易的消息提示框,它无法获取焦点,按设置的时间来显示完以后会自动消失,一般用于帮助或提示. 先给大家分享下我的解决思路: 不用计算Toast的时间之类的,就是定义一个全局的成员变量Toast, 这个Toast不为null的时候才去make,否则直接setText.为了按返回键后立即使Toast不再显示,重写父类Activity的onBackPressed()方法里面去cancel你的Toast即可. 代码: private Toast mToast; public void sh

Android编程实现自定义toast示例

本文实例讲述了Android编程实现自定义toast.分享给大家供大家参考,具体如下: 效果图: 代码: //自定义布局的toast customViewToast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast toast = Toast.makeText(ToastTest.this, "top", Toast.LENGTH_SHORT); /

Android Toast的用法总结(五种用法)

Toast大家都很熟,不多说.直接上图上代码.     具体代码如下: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layou

Android开发中Toast显示消息的方法小结

本文实例总结了Android开发中Toast显示消息的方法.分享给大家供大家参考,具体如下: Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些按钮后,提示用户一些信息,提示的信息不能被用户点击,Toast的提示信息根据用户设置的显示时间后自动消失.Toast的提示信息可以在调试程序的时候方便的显示某些想显示的东西. 两种方法创建Toast 第一种方法的Java代码: makeText(Context context, int resId, int duration)

android自定义toast(widget开发)示例

1.Toast控件: 通过查看源代码,发现Toast里面实现的原理是通过服务Context.LAYOUT_INFLATER_SERVICE获取一个LayoutInflater布局管理器,从而获取一个View对象(TextView),设置内容将其显示 复制代码 代码如下: public static Toast makeText(Context context, CharSequence text, int duration) {        Toast result = new Toast(c

android之自定义Toast使用方法

Android系统默认的Toast十分简洁,使用也非常的简单.但是有时我们的程序使用默认的Toast时会和程序的整体风格不搭配,这个时候我们就需要自定义Toast,使其与我们的程序更加融合. 使用自定义Toast,首先我们需要添加一个布局文件,该布局文件的结构和Activity使用的布局文件结构一致,在该布局文件中我们需设计我们Toast的布局,例如: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> &

android开发教程之实现toast工具类

Android中不用再每次都写烦人的Toast了,直接调用这个封装好的类,就可以使用了! 复制代码 代码如下: package com.zhanggeng.contact.tools; /** * Toasttool can make you  use Toast more easy ;  *  * @author ZHANGGeng * @version v1.0.1 * @since JDK5.0 * */import android.content.Context;import andro

Android开发中总结的Adapter工具类【附完整源码下载】

本文实例讲述了Android开发中总结的Adapter工具类.分享给大家供大家参考,具体如下: Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(ListView,GridView)等地方都需要用到Adapter. 每个开发工程师都会有自己的一些常用到的工具类,今天我分享一下我自己总结的关于Adapter的工具类,话不多说直接上代码 CommonAdapter: public abstract class CommonAdapter

Android开发实现的内存管理工具类

本文实例讲述了Android开发实现的内存管理工具类.分享给大家供大家参考,具体如下: /*********************************************** * 内存管理工具 * * @author chen.lin * @version 1.0 ************************************************/ public class MemoryManager { private static final String TAG =

Android开发之超实用的系统管理工具类【SD卡,网络,uri,屏幕,网络,软键盘,文本,进程等】

本文实例讲述了Android开发之超实用的系统管理工具类.分享给大家供大家参考,具体如下: 这是一个系统管理工具类,管理sd卡,判断网络,uri转换,获取屏幕宽高,获取网络类型,隐藏软键盘,复制文本到粘贴板,获取状态栏高度,获取当前进程等. 上代码 import java.io.File; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity

Android快速开发系列 10个常用工具类实例代码详解

打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java package com.zhy.utils; import android.util.Log; /** * Log统一管理类 * * * */ public class L { private L() { /* cannot be instantiated */ throw new UnsupportedOpe

Android开发之圆角矩形创建工具RoundRect类定义与用法分析

本文实例讲述了Android开发之圆角矩形创建工具RoundRect类.分享给大家供大家参考,具体如下: 用于把普通图片转换为圆角图像的工具类RoundRect类(复制即可使用): RoundRect.java import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import an

Android开发实现的Log统一管理类

本文实例讲述了Android开发实现的Log统一管理类.分享给大家供大家参考,具体如下: /** * Log统一管理类 * * */ public class Logger { private Logger() { /* cannot be instantiated */ throw new UnsupportedOperationException("cannot be instantiated"); } public static boolean isDebug = true;//

自定义Toast工具类ToastUtil防止多次点击时Toast不消失的方法

有时候我们点击一个按钮出现toast但是当不小心多次点击时,toast会重复出现,这时候通过下面的ToastUtil类可以实现不小心多次点击的问题. public class ToastUtil { /* private Context context; public ToastUtil(Context context) { this.context=context; }*/ private static Toast toast; public static void showToast(Con

Android实用的Toast工具类封装

大家好,Toast这个提示框大家都晓得,显示一段时间后自动消失,不能获得焦点.但是在使用中有些问题: 1)需要弹出一个新的Toast时,上一个Toast还没有显示完 2)可能重复弹出相同的信息 3)Toast具体有哪些用法不是很熟悉,用到时导出去找 4)app退出去了,Toast还在弹 等等一系列问题 下面封装了一个工具类,帮助大家管理Toast,基本上可以满足常用的需求,如果还满足不了,那就自定义了,呵呵~ import android.content.Context; import andr

Android开发教程之电源管理详解

本文实例讲述了Android电源管理.分享给大家供大家参考,具体如下: 一. 相关概念 1. 出于节电的需要,一般应用在用户一段时间无操作的情况下屏幕变暗,然后进入休眠状态 2. 用户只能在"设置->声音和显示"中设置所有应用默认的屏幕亮度和进行待机的时间 3. 电源管理的实现分内核应用两部分,通过下面介绍的接口,我们可以设置应用程序的电源管理,以控制与其休眠相关的状态(是否需要进入休眠,调整cpu频率,键盘灯的开关,屏幕的亮暗等) 二. 设置电源管理常用的几种状态 PARTIA