Preload multiple images with Glide

后端 未结 5 977
我寻月下人不归
我寻月下人不归 2020-11-30 02:07

We are trying to preload images into cache memory to load them later (the images are located in the Asset folder of the application)

<
5条回答
  •  广开言路
    2020-11-30 02:19

    //i can give you a solution
    
    /**
     * 1.reflect some objects inside Glide
     */
    fun prepareGlideObjects() {
        if (!enableFunctions || atomicPrepare.getAndSet(true)) {
            return
        }
        var t = LogTime.getLogTime()
        glide = Glide.get(BasicConfig.getInstance().appContext)
        if (diskCache == null) {
            val engine = getObject(glide, "engine")
            val diskCacheProvider = getObject(engine, "diskCacheProvider")
            val method = diskCacheProvider!!::class.java.getDeclaredMethod("getDiskCache")
            method.isAccessible = true
            diskCache = method.invoke(diskCacheProvider) as DiskCache
        }
        if (arrayPool == null) {
            arrayPool = getObject(glide, "arrayPool") as ArrayPool
        }
        if (decoder == null) {
            val registry = getObject(glide, "registry") as Registry
            val decoderRegistry = getObject(registry, "decoderRegistry") as ResourceDecoderRegistry
            val map = getObject(decoderRegistry, "decoders") as HashMap<*, *>
            val list = map["Bitmap"] as List<*>
            val o = list[0]
            decoder = getObject(o, "decoder") as ByteBufferBitmapDecoder
        }
        Log.debug(TAG, "prepareGlideObjects:" + LogTime.getElapsedMillis(t))
        try {
            t = LogTime.getLogTime()
            //首次打开diskCache 耗时较大,此处是提前打开文件索引
            val url = GlideUrl("http://xx.cdn.yy.com/fake_pic.jpg")
            val dataCacheKey = DataCacheKey(url, EmptySignature.obtain())
            diskCache?.get(dataCacheKey)
            Log.debug(TAG, "_load_fake_pic:" + LogTime.getElapsedMillis(t))
        } catch (e: Throwable) {
            Log.error(TAG, "cold load failed:$e")
        }
    }
    
    /**
     *2.load bitmap-file from diskCache
     */
    fun loadBitmap(url: String) {
        val gUrl = GlideUrl(url:String)
        val dataCacheKey = DataCacheKey(gUrl, EmptySignature.obtain())
        val file = diskCache?.get(dataCacheKey)
    }
    
    //3.decode bitmap from file
    private fun extractBitmapFromFile(url: String, file: File) {
        try {
            val dimen = getDimensionFromUrl(url)
            val result = decoder?.decode(ByteBufferUtil.fromFile(file), dimen[0], dimen[1],
                    Options()) as BitmapResource?
            result!!.initialize()
            //simple bitmap cache
            bitmapMap[url] = result.get()
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Log.debug(TAG, "allocationByteCount:" +
                        bitmapMap[url]!!.allocationByteCount / 1024.0)
            }
        } catch (e: Throwable) {
            Log.error(TAG, "init result failed:$e")
        }
    }
    
    //4.decode file from http-stream
    private fun decodeHttpStream() {
        val uri = GlideUrl(call?.request()?.url().toString())
        val contentLength = Preconditions.checkNotNull(responseBody).contentLength()
        val stream = ContentLengthInputStream.obtain(responseBody.byteStream(),
                contentLength)
        if (arrayPool == null) {
            //re prepare
            arrayPool = glide?.arrayPool
        }
        val encoder = StreamEncoder(arrayPool)
        val writer = DataCacheWriter(encoder, stream, Options())
        val originalKey = DataCacheKey(uri, EmptySignature.obtain())
        //ready,此处可以用来监控文件字节流写入本地文件的时间
        diskCache?.put(originalKey, writer)
        val file = diskCache?.get(uri)
    }
    

    //5.after these jobs done, load a bitmap from diskCache,it takes just 10ms。

提交回复
热议问题