首页 > 解决方案 > onAnimationEndListener 的可靠性如何?

问题描述

当用户播放下一首歌曲时,我制作了一个带有动画的媒体播放器应用程序,专辑封面淡出,下一首歌曲的专辑封面淡入。

我首先开始淡出动画,如果这个动画结束,我发送一个广播开始第二首歌。

我想知道它onAnimationEnd是否可靠并且总是会被调用,因为如果不是,那么我的应用程序基本上就不能再播放下一首/上一首歌曲了。

private void nextSong(){

        mAlbumArtLarge.startAnimation(fadeOutAnimation);
        mAlbumIvBottom.startAnimation(fadeOutAnimation);
        mAlbumArt.startAnimation(fadeOutAnimation);
        tvSongTitle.startAnimation(fadeOutAnimation);
        tvArtistName.startAnimation(fadeOutAnimation);
        tvSongListSize.startAnimation(fadeOutAnimation);

        fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (Main.getInstance().mServiceIsBound) {
                    Main.getInstance().mediaPlayerService.startActionNextSong(getApplication(), songList, songIndex);
                }
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }

标签: javaandroidandroid-animation

解决方案


根据我的经验,如果您在onCreate()活动开始期间运行动画view.post{ startAnimation() }并且在动画开始期间进入后台,则不会调用它,它不会调用侦听器。最终对我来说问题是使用post(Runnable)队列在主线程上执行,因为它在onCreate(). 我已经通过使用onWindowFocusChanged()+解决了它post{}。在生产中使用它一段时间后会更新我的答案。目前在不同的设备/API 上对其进行了测试,没有出现问题。

想一想:您可以添加一些(安全解决方法)带有计时器的处理程序(例如,如果动画没有结束,则为 5 秒,您在 5 秒后执行下一步)


推荐阅读