创建一个单例的Toast

使用场景

Toast也被称为吐司,比如说现在有两个地方弹一个吐司,当用户点击了A地方的时候吐司之后,又马上切换到B地方吐司,如果是没有使用单例的话,那么当弹起第一个吐司的时候,时间就会有2-3S的间隔才会弹出第二个吐司.那么给用户的体验就会非常不好.

默认的Toast写法

//如果是使用studio的话,可以打Toast就可以快速的写出这行代码,记得T必须是要大写,否则无法弹出对应的选项
Toast.makeText(MainActivity.this, "这是默认效果的Toast",  Toast.LENGTH_LONG).show();

单例Toast:

public class ToastUtil {/*** 第一次弹吐司的string*/private static String oldMsg;protected static Toast toast = null;/*** 第一次弹吐司的时间*/private static long oneTime = 0;/*** 再次弹吐司的时间*/private static long twoTime = 0;public static void showToast(Context context, String s) {if (toast == null) {toast = Toast.makeText(context, s, Toast.LENGTH_SHORT);toast.show();oneTime = System.currentTimeMillis();//当前系统的时间} else {twoTime = System.currentTimeMillis();//再次获取系统的时间//判断传入的string是否与之前传入的string相同if (s.equals(oldMsg)) {//判断两次获取的当前系统时间是否超过默认的吐司时间,超过就再次吐司,否则就不再吐司if (twoTime - oneTime > Toast.LENGTH_SHORT) {toast.show();}} else {oldMsg = s;toast.setText(s);toast.show();}}oneTime = twoTime;}public static void showToast(Context context, int resId) {showToast(context, context.getString(resId));}}

表面上看没什么问题,但是在真实运用过程中,就会出现内存泄漏的问题。原因也很简单,当弹出一个toast的时候,当前页面关闭,但是toast还是引用了context。导致无法GC。所以应该将context变成context.getApplicationContext()。

最终的代码:

public class ToastUtil {/*** 第一次弹吐司的string*/private static String oldMsg;protected static Toast toast = null;/*** 第一次弹吐司的时间*/private static long oneTime = 0;/*** 再次弹吐司的时间*/private static long twoTime = 0;public static void showToast(Context context, String s) {if (toast == null) {toast = Toast.makeText(context.getApplicationContext(), s, Toast.LENGTH_LONG);toast.show();oneTime = System.currentTimeMillis();//当前系统的时间} else {twoTime = System.currentTimeMillis();//再次获取系统的时间if (s.equals(oldMsg)) {//判断两次的string是否相同if (twoTime - oneTime > Toast.LENGTH_LONG) {//判断两次获取的当前系统时间是否超过默认的吐司时间,超过就再次吐司,否则就不再吐司toast.show();}} else {oldMsg = s;toast.setText(s);toast.show();}}oneTime = twoTime;}
public static void showToast(Context context, int resId) {showToast(context, context.getString(resId));}}

自定义Toast

自定义显示位置

Toast toast = Toast.makeText(MainActivity.this, "这是自定义位置的Toast", Toast.LENGTH_LONG);//设置Toast在屏幕上显示的位置toast.setGravity(Gravity.CENTER, 20,80);toast.show();

自定义显示图标:

Toast toast = Toast.makeText(MainActivity.this, "这是带图片的Toast", Toast.LENGTH_LONG);//创建一个子布局用于自定义Toast的内容LinearLayout toastView = (LinearLayout) toast.getView();//在这个子布局中定义一个ImageView用于添加Toast显示的图片ImageView  iv= new ImageView(MainActivity.this);iv.setImageResource(R.drawable.p3);//把ImageView添加到子布局当中toastView.addView(iv, 0);toast.show();

完全自定义的:

//创建一个布局,用于承载Toast中的内容LayoutInflater inflater = getLayoutInflater();View view = inflater.inflate(R.layout.cell, null);//Toast中的内容之一ImageView用于显示图片ImageView iv = (ImageView) view.findViewById(R.id.iv);iv.setImageResource(R.drawable.p4);//Toast中的内容之二TextView用于显示Toast的标题TextView title = (TextView) view.findViewById(R.id.tv_title);title.setText("注意:");//Toast中的内容之三TextView用于显示Toast的信息内容TextView text = (TextView) view.findViewById(R.id.tv_message);text.setText("这是完全自定义Toast");//创建一个Toast对象Toast toast = new Toast(MainActivity.this);//设置Toast的显示位置为屏幕的右上方toast.setGravity(Gravity.RIGHT | Gravity.TOP, 100,100);//设置Toast的显示时间toast.setDuration(Toast.LENGTH_LONG);//设置Toast显示的布局toast.setView(view);toast.show();

其实就是将一个布局文件显示在Toast上

在线程中使用:

Handler handler = new Handler();public void showToast() {handler.post(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "线程中的Toast", Toast.LENGTH_LONG).show();}});}
new Thread(new Runnable() {public void run() {showToast();}}).start();

如果直接在子线程Toast,那么就会报错,:Can’t create handler inside thread that has not called Looper.prepare().至于为什么会这样大家可以参考这个链接.上面有讲的很清楚.

关于Toast的一些常见操作相关推荐

  1. ArcGIS for Android Runtime100 基本操作(二)——地图控件的常见操作

    以前我刚开始学习ArcGIS时候,看得最常见的一篇博客是Ersi中国官方写的一篇<ArcGIS for Android地图控件的5大常见操作>,地址是http://blog.csdn.ne ...

  2. python设置字符间距_Python中字符串的常见操作技巧总结

    本文实例总结了Python中字符串的常见操作技巧.分享给大家供大家参考,具体如下: 反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S ...

  3. 路径,文件,目录,I/O常见操作汇总

    摘要:    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案 ...

  4. python字典操作添加_Python字典常见操作实例小结【定义、添加、删除、遍历】

    本文实例总结了python字典常见操作.分享给大家供大家参考,具体如下: 简单的字典: 字典就是键值对key-value组合. #字典 键值对组合 alien_0 ={'color':'green', ...

  5. BOM,DOM常见操作和DHML

    BOM (Browser Object Model)浏览器对象模型,控制浏览器的一些行为 window对象 代表一个HTML文档 属性 页面导航的5个属性 self, parent, top, ope ...

  6. go语言笔记——切片函数常见操作,增删改查和搜索、排序

    7.6.6 搜索及排序切片和数组 标准库提供了 sort 包来实现常见的搜索和排序操作.您可以使用 sort 包中的函数 func Ints(a []int) 来实现对 int 类型的切片排序.例如  ...

  7. 在单链表写入一组数据代码_链表常见操作和15道常见面试题

    什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...

  8. python基础实例-Python基础之字符串常见操作经典实例详解

    本文实例讲述了Python基础之字符串常见操作.分享给大家供大家参考,具体如下: 字符串基本操作 切片 # str[beg:end] # (下标从 0 开始)从下标为beg开始算起,切取到下标为 en ...

  9. C#路径/文件/目录/I/O常见操作汇总(一)

    文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题, 尽量提供一些解决方案,即使没有你想要的答案,也希望能提 ...

  10. python下selenium模拟浏览器常见操作

    本文主要记录下selenium的常见操作,如定位具体元素的不同方法.在具体元素内循环.提取文本等.具体代码如下: # -*- coding: utf-8 -*- ''' Created on 2019 ...

最新文章

  1. Kubernetes — 容器设计模式
  2. Rotate List
  3. 【Python】Flask 框架安装虚拟环境报错—处理中......
  4. Ant Design Vue select下拉列表设置默认值
  5. 7.04 -2018-长沙机场笔试总结
  6. Linux(shell)遍历目录删除指定文件,解决文件夹名称带空格问题
  7. 计算机网络是通过通信媒体 把各个独立,计算机网络试题选择题精华
  8. 英特尔的务实创新之路:实在做技术,赋能开发者 | InfoQ推荐
  9. Job 存储和持久化 (第二部分)
  10. 设置谷歌浏览器和Edge浏览器为黑色背景
  11. R语言中dim函数_R 语言中的矩阵计算
  12. 熟悉VBA的编程环境---VBE
  13. Android 12上焕然一新的小组件
  14. MSSQL 数据库邮件配置
  15. 查看tcp 请求中的各个状态数据
  16. 2021-10-20-Flask-01- 基本运行框架及配置文件
  17. 各种注意事项集合(to be continued)
  18. 高校校园无线认证计费解决方案
  19. 【秋招面经】金山前端题目总结
  20. ([转载]魔百和CM201-2 M8375版安装当贝桌面方法)

热门文章

  1. 记录一个看着比较顺眼的blockquote的css装饰
  2. 如何快速打开.pos
  3. linux apache找不到woff2,IIS Web部署: svg/woff/woff2字体找不到
  4. 稳压二极管_百度百科
  5. C#简单实现office转pdf、pdf转图片
  6. 水浊度传感器( ADC 代码详解)
  7. 计算机视觉/图像处理领域相关研究机构梳理
  8. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
  9. 1.工作汇报结构: 黄金圈法则结构、PREP结构、时间轴结构、金字塔结构
  10. 【随机过程】课后作业 1-条件概率期望密度