Toast源码深度分析

 

目录介绍

  • 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(); } 
    
                        
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信