Skip to content

v9.0

Compare
Choose a tag to compare
@getActivity getActivity released this 16 Apr 02:15
· 26 commits to master since this release

ToastUtils 框架重构了,专治 Toast 各种疑难杂症,具体的变化如下:

  • 显示方式不同:多个 Toast 同时显示,旧版本上面会采用排队显示机制,只有上一个显示完了才会显示下一个,能保证 Toast 的完整性,但是损失了 Toast 的即时性,经过调研大家更注重 Toast 的即时性,所以在新版本上面会取消上一个 Toast 显示,再显示下一个 Toast。

  • 初始化方式不同:旧版本上采用的是饿汉式机制,ToastUtils.init 会初始化 Toast 对象和 Toast 布局,这样会影响 Application 的启动速度,经过认真思考,最终决定在新版本上换成懒汉式,也就是每次在 ToastUtils.show 时去创建 Toast 对象和 Toast 布局。

  • 复用机制不同:旧版本上面采用是单例 Toast,这样做的好处是复用 Toast 对象和 Toast 布局,但是在某些情况会出现 IllegalStateException:View has already been added to the window manager 异常,这个问题极其难复现,在经过了十几个人的反馈之后,我终于等到了那个真正能复现这个问题的人,经过了长达一个多星期的排查和尝试修复,我放弃了对 Toast 对象和 Toast 布局的复用,而是每次 show 的时候都去创建 Toast 对象和 Toast 布局。

  • Android 11 适配更好:在 Android 11 上面,旧版本的 ToastUtils 采用的是 WindowManager 来显示自定义的 Toast,所以只会在当前应用上显示,这样会存在有一个问题,应用无法在后台显示自定义 Toast ,经过对 Android 11 Toast 的机制研究和实践,发现系统 Toast 在 Android 11 上面其实是可以在后台显示,但是不允许自定义布局,新版本的 ToastUtils 做了一个智能化处理,如果当前应用处于前台状态,就使用 WindowManager 来显示 Toast,如果当前应用处于后台状态,那么会判断当前设备是否是 Android 11,如果是就使用系统样式来显示 Toast,如果不是则会使用我们自定义的样式,由此来保证 Toast 能够正常显示给到用户。