程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了启用 Exoplayer 缓存后滑动缓慢加载大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决启用 Exoplayer 缓存后滑动缓慢加载?

开发过程中遇到启用 Exoplayer 缓存后滑动缓慢加载的问题如何解决?下面主要结合日常开发的经验,给出你关于启用 Exoplayer 缓存后滑动缓慢加载的解决方法建议,希望对你解决启用 Exoplayer 缓存后滑动缓慢加载有所启发或帮助;

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

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

除了在我启用 ExoPlayer 使用缓存播放后图像(目前大约 12 个)的加载速度变慢外,一切正常。在为 ExoPlayer 实现 Cache 之前,GlIDe 在启动时立即显示图像(不到 1 秒),但在为 ExoPlayer 使用 Cache 后,显示 6~7 行 RecyclervIEw 大约需要 3~4 秒。

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

    }
@H_262_20@

这是我的缓存助手类(从 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()

    }

}
@H_262_20@

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

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

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

问题 2:这正常吗?我该怎么做才能将 GlIDe 恢复到以前的加载速度。

注意)Firestore 上的图片文件大小范围为 200kb-1.0MB(有些文件为了测试目的而故意很大)

  • AndroID studio 4.2/Kotlin
  • 测试模拟器:NEXUS 5X API 25

非常感谢!

解决方法

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

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

源链接:https://github.com/bumptech/glide/issues/4429#issuecomment-737870711

大佬总结

以上是大佬教程为你收集整理的启用 Exoplayer 缓存后滑动缓慢加载全部内容,希望文章能够帮你解决启用 Exoplayer 缓存后滑动缓慢加载所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。