启用 Exoplayer 缓存后 Glide 缓慢加载

Glide slow loading after Exoplayer Cache enabled

第一次在 Whosebug 上写这篇文章。 (你打赌我是 Android 开发的菜鸟)

我一直在试验一个类似 Spotify 的克隆应用程序,它有一个显示歌曲缩略图的 Recyclerview,并通过 URL 从 Firestore 数据库加载 mp3。该应用程序使用 Glide 显示图像并使用 ExoPlayer 播放 mp3。

除了在我启用 ExoPlayer 以使用缓存播放后加载图像(目前大约有 12 个图像)有点慢之外,一切正常。在为 ExoPlayer 实施 Cache 之前,Glide 在启动时立即显示图像(不到 1 秒),但在为 ExoPlayer 使用 Cache 之后,大约需要 3~4 秒才能显示 6~7 行 Recyclerview。

ExoPlayer 在使用 cacheDataSoruce 之前准备

      private fun prepPlayerNormal(url: String?) { // NORMAL

            val uri = Uri.parse(url)
            val localMp3Uri = RawResourceDataSource.buildRawResourceUri(R.raw.rocounty_demo)
            val mediaItem = MediaItem.fromUri(uri)
            val mediaSource = ProgressiveMediaSource.Factory(DefaultDataSourceFactory(receivedContext, dataSourceFactory), DefaultExtractorsFactory()).createMediaSource(mediaItem)
            exoPlayer.setMediaSource(mediaSource)
            exoPlayer.prepare()
            exoPlayer.playWhenReady = true
        }

ExoPlayer 在使用 cacheDataSoruce 后准备

private fun prepPlayerWithCache(url:String?) { 

        val mp3Uri = Uri.parse(url)
        val mediaItem = MediaItem.fromUri(mp3Uri)
        val mediaSource = ProgressiveMediaSource.Factory(cacheDataSourceFactory).createMediaSource(mediaItem)

        exoPlayer.setMediaSource(mediaSource, true)
        exoPlayer.prepare()
        exoPlayer.playWhenReady = true

    }

这是我的缓存助手 class(从 OnCreate() 中的 MainActivity 调用):

class MyCacher(private val receivedContext: Context, private val cacheDir: File, private val mpInstanceReceived: MyMediaPlayer ) {

    companion object {
        var simpleCache: SimpleCache? = null
        var leastRecentlyUsedCacheEvictor: LeastRecentlyUsedCacheEvictor? = null
        var exoDatabaseProvider: ExoDatabaseProvider? = null
        var exoPlayerCacheSize: Long = 90 * 1024 * 256
    }

    fun initCacheVariables() { 
        if (leastRecentlyUsedCacheEvictor == null) {
            leastRecentlyUsedCacheEvictor = LeastRecentlyUsedCacheEvictor(exoPlayerCacheSize)
            Log.d(TAG, "initCacheVariables: inside leastRecentlyUsed....")
        }

        if (exoDatabaseProvider == null) {
            exoDatabaseProvider = ExoDatabaseProvider(receivedContext)
            Log.d(TAG, "initCacheVariables: inside exoDatabaseProvider ... ")
        }

        if (simpleCache == null) {
            simpleCache = SimpleCache(cacheDir, leastRecentlyUsedCacheEvictor!!, exoDatabaseProvider!!)
            Log.d(TAG, "initCacheVariables: inside simpleCache..")
        }
        
        mpInstanceReceived.initExoPlayerWithCache()

    }

}

据我了解,ExoPlayer 的缓存使用 RAM,而 Glide 从写入磁盘的缓存中读取。两者如何相互影响对我来说是个谜。 我搜索了一个论坛,但到目前为止没有找到相关主题。

总结: 在执行 ExoPlayer 使用 CacheDataSource 流式传输 mp3 后,Glide 的加载速度变慢了(延迟 2-3 秒在 Recycler 的 6 到 7 行上显示缩略图大小的图像查看)

问题 1:ExoPlayer 从缓存中播放如何影响我的 Glide 加载速度?

问题 2:这正常吗?我应该怎么做才能让我的 Glide 恢复到之前的加载速度。

注意)Firestore 上的图像文件大小在 200kb-1.0MB 之间(有些文件为了测试目的故意变大)

提前致谢!

经过大约一周的努力(和过度搜索),我找到了解决方案。事实证明,ExoPlayer 和 Glide 共享同一个文件夹,而 SimpleCache 的构造函数正在删除 Glide 的缓存,因为它们是无法识别的文件。

您可以通过为 ExoPlayer 的缓存使用不同的位置(或添加子文件夹)来解决此问题

来源link:https://github.com/bumptech/glide/issues/4429#issuecomment-737870711