Android 多版本Toast版本区别以及使用可能遇到的问题
Toast多次显示的版本区别
早期 Android(9及之前):同一个 Toast 多次 show,会延长显示时间。
Android 10/11 及以后:Toast 机制重构,底层采用了新的 ToastPresenter/ToastUI,防止 Toast 滥用。
多次 show 并不会延长显示时间,甚至会报错。包括android U。
Android 11 Toast行为变更 :只会显示一次,后续 show 只会延长到最大时间(3.5s),不会无限延长,也不会重新显示
Android U报错:
NotificationService: cancelToast pkg=com.XXX.XXX.XXX token=android.os.BinderProxy@518d211
CoreBackPreview: Window{d439d3f u0 Toast}: Setting back callback null
InputManager-JNI: Input channel object 'd439d3f Toast (client)' was disposed without first being removed with the input manager!
WindowManager: Attempted to add a toast window with unknown token android.os.Binder@45ece5b. Aborting.
ToastPresenter: Error while attempting to show toast from com.XXX.XXX.XXX
ToastPresenter: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@5cb0df0 is not valid; is your activity running?
ToastPresenter: at android.view.ViewRootImpl.setView(ViewRootImpl.java:1539)
ToastPresenter: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:411)
ToastPresenter: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:150)
ToastPresenter: at android.widget.ToastPresenter.addToastView(ToastPresenter.java:342)
ToastPresenter: at android.widget.ToastPresenter.show(ToastPresenter.java:256)
ToastPresenter: at com.android.systemui.toast.ToastUI$$ExternalSyntheticLambda0.run(go/retraceme 4fb9a8aa0330e6a481ec4694d8141764de40b212263105c9b4877ebb36b7816c:266)
ToastPresenter: at com.android.systemui.toast.ToastUI$ToastOutAnimatorListener.onAnimationEnd(go/retraceme 4fb9a8aa0330e6a481ec4694d8141764de40b212263105c9b4877ebb36b7816c:12)
ToastPresenter: at android.animation.Animator$AnimatorListener.onAnimationEnd(Animator.java:711)
ToastPresenter: at android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1.call(Unknown Source:4)
ToastPresenter: at android.animation.Animator.callOnList(Animator.java:669)
ToastPresenter: at android.animation.Animator.notifyListeners(Animator.java:608)
ToastPresenter: at android.animation.Animator.notifyEndListeners(Animator.java:633)
ToastPresenter: at android.animation.AnimatorSet.endAnimation(AnimatorSet.java:1443)
ToastPresenter: at android.animation.AnimatorSet.doAnimationFrame(AnimatorSet.java:1230)
ToastPresenter: at android.animation.AnimationHandler.doAnimationFrame(AnimationHandler.java:344)
ToastPresenter: at android.animation.AnimationHandler.-$$Nest$mdoAnimationFrame(Unknown Source:0)
ToastPresenter: at android.animation.AnimationHandler$1.doFrame(AnimationHandler.java:87)
ToastPresenter: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1341)
ToastPresenter: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1352)
ToastPresenter: at android.view.Choreographer.doCallbacks(Choreographer.java:952)
ToastPresenter: at android.view.Choreographer.doFrame(Choreographer.java:878)
ToastPresenter: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1326)
ToastPresenter: at android.os.Handler.handleCallback(Handler.java:958)
ToastPresenter: at android.os.Handler.dispatchMessage(Handler.java:99)
ToastPresenter: at android.os.Looper.loopOnce(Looper.java:205)
ToastPresenter: at android.os.Looper.loop(Looper.java:294)
ToastPresenter: at android.app.ActivityThread.main(ActivityThread.java:8248)
ToastPresenter: at java.lang.reflect.Method.invoke(Native Method)
ToastPresenter: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
ToastPresenter: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:981)
Toast使用情况:
1)在toast显示期间,使用同一个对象再次show(不调用cancel),会报错,且第一个显示之后,多次调用show之后的最后一次超过4s(经验值)之后才能再次show,否则还是会报错,不显示;
2)每次显示toast都使用新的对象。 toast显示期间来了新的,是顺序执行,依次执行,会导致现象过去很久,toast还在显示;
3)toast显示期间,使用同一个对象show,但是每次调用之前都执行cancel,同1)。
4)toast显示期间,新来内容,cancel上一个,在使用新对象,每次都能显示:可能导致上一个toast刚显示就消失了,存在闪现的问题。
