Android8.0 Toast使用注意
阿新 • • 發佈:2018-12-28
Toast是一個用於提示資訊的控制元件。但是在Android8.0上,這個Toast有些改變,使用需要小心。
考慮以下場景:
- 一個應用(同一個UID)在同一時間內顯示兩個Toast物件,假設A、B
- A呼叫了顯示,顯示了出來
- 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來防止出現這個問題。
=================================
以上分析來源於某大神~~