We are trying to preload images into cache memory to load them later (the images are located in the Asset folder of the application)
<
//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。