Android8.0 Toast使用注意

Toast是一个用于提示信息的控件。但是在Android8.0上,这个Toast有些改变,使用需要小心。

考虑以下场景:

  1. 一个应用(同一个UID)在同一时间内显示两个Toast对象,假设A、B
  2. A调用了显示,显示了出来
  3. A还在显示中,B也调用了显示,准备显示

预期结果:

     A隐藏,B消失

实际结果:

   A继续显示,B没有显示

更糟糕的事情:

   后面如果程序中再次调用B进行显示,应用将出现闪退。

修改方案

    同一个应用中不用使用两个Toast对象,使用同一个Toast对象(单例),避免出现此类现象

问题分析

   为什么会出现闪退?从log上看是因为Toast在调用Window manager接口addView的时候出现add同一个view的情况,导致抛出异常。抛出异常的代码如下:

   Android8.0 Toast使用注意_第1张图片

Android8.0 Toast使用注意_第2张图片

查看Toast的代码,明明在show的代码里会做很多防护措施,怎么还会出现这种情况呢?

Android8.0 Toast使用注意_第3张图片

以上代码看起来没有问题,实际上问题就出在handleHide函数里,这个函数会失败。

Android8.0 Toast使用注意_第4张图片

addView出现失败,竟然view还被add了,查看内部实现。

Android8.0 Toast使用注意_第5张图片

查看setView的内部实现

Android8.0 Toast使用注意_第6张图片

Android8.0 Toast使用注意_第7张图片

Android8.0 Toast使用注意_第8张图片

Android8.0 Toast使用注意_第9张图片

Android8.0 Toast使用注意_第10张图片

因此,从上面可以看到,再add第二个toast的时候,是出现了异常,没有addView成功,且抛出了异常。

异常被谁截获?

Android8.0 Toast使用注意_第11张图片

最终,问题原因找到了,Google目前就是不支持同一个应用的两个toast同时显示,用了就会让你知道后果(直接闪退),只告诉重复add了,也不提示根本原因在哪儿。

目前应用上只有修改自己的code来防止出现这个问题。

=================================

以上分析来源于某大神~~

你可能感兴趣的:(#,Exception)