1. 程式人生 > >Android8.0 Toast使用注意

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的情況,導致丟擲異常。丟擲異常的程式碼如下:

   

檢視Toast的程式碼,明明在show的程式碼裡會做很多防護措施,怎麼還會出現這種情況呢?

以上程式碼看起來沒有問題,實際上問題就出在handleHide函式裡,這個函式會失敗。

addView出現失敗,竟然view還被add了,檢視內部實現。

檢視setView的內部實現

因此,從上面可以看到,再add第二個toast的時候,是出現了異常,沒有addView成功,且丟擲了異常。

異常被誰截獲?

最終,問題原因找到了,Google目前就是不支援同一個應用的兩個toast同時顯示,用了就會讓你知道後果(直接閃退),只告訴重複add了,也不提示根本原因在哪兒。

目前應用上只有修改自己的code來防止出現這個問題。

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

以上分析來源於某大神~~