目录介绍
- 1.最简单的创建方法
- 1.1 Toast构造方法
- 1.2 最简单的创建
- 1.3 简单改造避免重复创建
- 1.4 为何会出现内存泄漏
- 1.5 吐司是系统级别的
- 2.源码分析
- 2.1 Toast(Context context)构造方法源码分析
- 2.2 show()方法源码分析
- 2.3 mParams.token = windowToken是干什么用的
- 2.4 scheduleTimeoutLocked吐司如何自动销毁的
- 2.5 TN类中的消息机制
- 2.6 普通应用的Toast显示数量是有限制的
- 2.7 为何Activity销毁后Toast仍会显示
- 3.经典总结
- 3.1 判断应用程序获取通知权限是否开启
- 3.2 使用Toast注意事项
- 3.3 Toast的显示和隐藏重点逻辑
- 3.4 Snackbar和Toast比较
- 4.Toast封装库介绍
- 4.1 能够满足的需求
- 4.2 具有的优势
- 5.Toast遇到的问题
- 5.1 Toast偶尔报错Unable to add window
- 5.2 Toast运行在子线程问题
- 5.3 Toast如何添加系统窗口的权限
- 5.4 token null is not valid
好消息
- 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计47篇[近20万字],转载请注明出处,谢谢!
- 链接地址:https://github.com/yangchong211/YCBlogs
- 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!
- Toast封装库项目地址:https://github.com/yangchong211/YCDialog
- 02.Toast源码深度分析
- 最简单的创建,简单改造避免重复创建,show()方法源码分析,scheduleTimeoutLocked吐司如何自动销毁的,TN类中的消息机制是如何执行的,普通应用的Toast显示数量是有限制的,用代码解释为何Activity销毁后Toast仍会显示,Toast偶尔报错Unable to add window是如何产生的,Toast运行在子线程问题,Toast如何添加系统窗口的权限等等
- 03.DialogFragment源码分析
- 最简单的使用方法,onCreate(@Nullable Bundle savedInstanceState)源码分析,重点分析弹窗展示和销毁源码,使用中show()方法遇到的IllegalStateException分析
- 05.PopupWindow源码分析
- 显示PopupWindow,注意问题宽和高属性,showAsDropDown()源码,dismiss()源码分析,PopupWindow和Dialog有什么区别?为何弹窗点击一下就dismiss呢?
- 06.Snackbar源码分析
- 最简单的创建,Snackbar的make方法源码分析,Snackbar的show显示与点击消失源码分析,显示和隐藏中动画源码分析,Snackbar的设计思路,为什么Snackbar总是显示在最下面
- 07.弹窗常见问题
- DialogFragment使用中show()方法遇到的IllegalStateException,什么常见产生的?Toast偶尔报错Unable to add window,Toast运行在子线程导致崩溃如何解决?
1.最简单的创建方法
1.1 Toast构造方法
- Toast只会弹出一段信息,告诉用户某某事情已经发生了,过一段时间后就会自动消失。它不会阻挡用户的任何操作。
- Toast是没有焦点,而且Toast显示的时间有限,过一定的时间就会自动消失。
- 通过new Toast(context)直接创建,除了将mContext = context,还有一步重要的操作,创建TN,下面会说到……
public Toast(Context context) { mContext = context; mTN = new TN(); mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); mTN.mGravity = context.getResources().getInteger( com.android.internal.R.integer.config_toastDefaultGravity); }
1.2 最简单的创建
- 一行代码调用,十分方便,但是这样存在一种弊端。
- 使用中遇到的问题:例如,当点击有些按钮,需要吐司进行提示时;快速连续点击了多次按钮,Toast就触发了多次。系统会将这些Toast信息提示框放到队列中,等前一个Toast信息提示框关闭后才会显示下一个Toast信息提示框。可能导致Toast就长时间关闭不掉了。又或者我们其实已在进行其他操作了,应该弹出新的Toast提示,而上一个Toast却还没显示结束
Toast.makeText(this,"吐司",Toast.LENGTH_SHORT).show();
1.3 简单改造避免重复创建
- 为了解决1.2中的重复创建问题,则可以这样解决
- 如下所示,简易型代码,需要注意问题,这里传递的上下文context需要是activity.getApplicationContext()全局上下文,避免静态toast对象内存泄漏
/** * 吐司工具类 避免点击多次导致吐司多次,最后导致Toast就长时间关闭不掉了 * 注意:这里如果传入context会报内存泄漏;传递activity..getApplicationContext() * @param content 吐司内容 */ private static Toast toast; @SuppressLint("ShowToast") public static void showToast(String content) { checkContext(); if (toast == null) { toast = Toast.makeText(mApp, content, Toast.LENGTH_SHORT); } else { toast.setText(content); } toast.show(); }
