Как определить завершение GIF с помощью Glide? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь выяснить, как я могу определить последний индекс кадра и когда это последний кадр, который является конечным кадром.Затем я хотел бы реализовать, что он переходит к следующему действию.

Это SplashActivity.

Но проблема в том, что я просто получаю индекс -1 все время, и он не 't вообще не увеличивается.

Вот мой код Glide:

Glide.with(this)
        .asGif()
        .load(R.drawable.bg_splash)
        .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)) // Saves no data to cache.
        .listener(object : RequestListener<GifDrawable> {
            override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<GifDrawable>?, isFirstResource: Boolean): Boolean {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.

                return false
            }

            override fun onResourceReady(resource: GifDrawable?, model: Any?, target: Target<GifDrawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                resource!!.setLoopCount(1)
                resource!!.start()
                while (true) {
                    Timber.d("resource: ${resource.frameIndex} / ${resource.frameCount}")
                    if (!resource!!.isRunning) {
                        break
                    } else {
                        if (resource.frameIndex == resource.frameCount - 1) {
                            val intent = Intent(this@SplashActivity, MainActivity::class.java)  // Intent 선언
                            startActivity(intent)
                            finish()
                            overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out)
                        }
                    }
                }
                return false
            }

        })
        .into(iv_splash)

результат в logcat:

resource: -1 / 216
resource: -1 / 216
resource: -1 / 216
resource: -1 / 216
...

Как я могу решить эту проблему!?

1 Ответ

0 голосов
/ 16 мая 2019

Проблема заключалась в том, что один цикл (основной поток) застрял в цикле while.

Итак, для проверки текущего индекса нужен еще один поток. И пусть поток пользовательского интерфейса (основной поток) играет.

Мое решение:

Glide.with(this)
        .asGif()
        .load(R.drawable.bg_splash)
        .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE)) // Saves no data to cache.
        .listener(object : RequestListener<GifDrawable> {
            override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<GifDrawable>?, isFirstResource: Boolean): Boolean {
                return false
            }

            override fun onResourceReady(resource: GifDrawable?, model: Any?, target: Target<GifDrawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                resource!!.setLoopCount(1)
                gifFrameCheckThread = Thread(Runnable {
                    while (true) {
                        Timber.d("resource: ${resource.frameIndex} / ${resource.frameCount}")
                        if (resource.frameIndex + 1 == resource.frameCount - 1) {
                            val intent = Intent(this@SplashActivity, MainActivity::class.java)  // Intent 선언
                            startActivity(intent)
                            gifFrameCheckThread.join()
                            finish()
                            overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out)
                        }
                    }
                })
                gifFrameCheckThread.start()
                return false
            }
        })
        .into(iv_splash)
...