Последовательность анимации для SplashScreen внутри AsyncTask не работает - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу запустить последовательность анимации на заставке, когда данные загрузки загружаются в приложение. До того, как я поместил анимацию в asyncTask, она работала отлично, но анимация не должна запускаться до загрузки данных запуска. Поэтому я сделал asyncTask вызов API для этого. Внутри onPreExecute() я хочу запустить анимационную последовательность, а в doInBackground() есть startupRequest().

Проблема с этим решением -> Если я запускаю заставку, анимация запускается (я проверял это), но она сразу же замерзает при переходе к методу doInBackground() -> вторая анимация не вызывается.

Я даже пытался сделать анимацию вызова внутри runOnUiThread() метода (что бесполезно, потому что onPreExecute () должен запускаться в потоке пользовательского интерфейса - это для ProgressBar или тому подобного).

вызов AsyncTask и метод анимации:

fun splashScreen(splashActivity: Splash){
        class GetSplashAsync: AsyncTask<Void, Void, Boolean>() {

            override fun onPreExecute() {
                createLog("SplashScreen: ", "Starting onPreExecute() --> anim on UIThread")
                splashActivity.runOnUiThread {
                    splashActivity.splashAnimation()
                }
            }

            override fun doInBackground(vararg params: Void?): Boolean {
                return splashActivity.startupRequest()
            }

        }

        GetSplashAsync().execute()
    }


fun splashAnimation(){

        val firstAnim = AnimationUtils.loadAnimation(this, R.anim.splash_first_anim)
        val secondAnim = AnimationUtils.loadAnimation(this, R.anim.splash_second_anim)

        firstAnimImg.visibility = View.INVISIBLE
        secondAnimImg.visibility = View.INVISIBLE

        createLog("SplashScreenAnim: ", "Starting anim 1")
        firstAnimImg.startAnimation(firstAnim)


        firstAnim.setAnimationListener(object: Animation.AnimationListener{
            override fun onAnimationStart(p0: Animation?) {
                firstAnimImg.visibility = View.VISIBLE
            }

            override fun onAnimationRepeat(p0: Animation?) {

            }

            override fun onAnimationEnd(p0: Animation?) {
                createLog("SplashScreenAnim: ", "Starting anim 2")
                secondAnimImg.startAnimation(secondAnim)
            }

        })

        secondAnim.setAnimationListener(object: Animation.AnimationListener{
            override fun onAnimationStart(p0: Animation?) {
                secondAnimImg.visibility = View.VISIBLE
            }

            override fun onAnimationRepeat(p0: Animation?) {

            }

            override fun onAnimationEnd(p0: Animation?) {
            }

        })

    }

1 Ответ

0 голосов
/ 04 сентября 2018

Рассмотрите возможность изменения последовательности выполнения, как показано ниже в методе splashAnimation():

fun splashAnimation(){

    val firstAnim = AnimationUtils.loadAnimation(this, R.anim.splash_first_anim)
    val secondAnim = AnimationUtils.loadAnimation(this, R.anim.splash_second_anim)

    firstAnimImg.visibility = View.INVISIBLE
    secondAnimImg.visibility = View.INVISIBLE

    firstAnim.setAnimationListener(object: Animation.AnimationListener{
        override fun onAnimationStart(p0: Animation?) {
            firstAnimImg.visibility = View.VISIBLE
        }

        override fun onAnimationRepeat(p0: Animation?) {

        }

        override fun onAnimationEnd(p0: Animation?) {
            createLog("SplashScreenAnim: ", "Starting anim 2")
            secondAnimImg.startAnimation(secondAnim)
        }

    })

    secondAnim.setAnimationListener(object: Animation.AnimationListener{
        override fun onAnimationStart(p0: Animation?) {
            secondAnimImg.visibility = View.VISIBLE
        }

        override fun onAnimationRepeat(p0: Animation?) {

        }

        override fun onAnimationEnd(p0: Animation?) {
        }

    })

    createLog("SplashScreenAnim: ", "Starting anim 1")
    firstAnimImg.startAnimation(firstAnim) //Started this animation at last after setting up all animation listener, be sure if you've duration in xml. 
}
...