glide ejemplo developer java android image android-glide

java - ejemplo - Precarga múltiples imágenes con Glide



glide placeholder (4)

Glide versión 4.6.1

RequestOptions requestOptions = RequestOptions .diskCacheStrategy(DiskCacheStrategy.ALL); Glide.with(appContext) .asBitmap() .load(model) .apply(requestOptions) .submit();

Estamos tratando de precargar imágenes en la memoria caché para cargarlas más tarde (las imágenes se encuentran en la carpeta de Activos de la aplicación)

Lo que intentamos:

Glide.with(this) .load(pictureUri) .diskCacheStrategy(DiskCacheStrategy.ALL); Glide.with(this) .load(picture_uri) .diskCacheStrategy(DiskCacheStrategy.ALL) .preload();

El problema: las imágenes se almacenan en la memoria caché solo cuando intentamos cargarlas / visualizarlas: deben cargarse en la memoria antes para que aparezcan más rápido.

Glide.with(this) .load(picture_uri) .into(imageView);

También intentamos usar un GlideModule para aumentar el tamaño de CacheMemory:

public class GlideModule implements com.bumptech.glide.module.GlideModule { @Override public void applyOptions(Context context, GlideBuilder builder.setMemoryCache(new LruResourceCache(100000)); } @Override public void registerComponents(Context context, Glide glide) { } }

En el manifiesto:

<meta-data android:name=".GlideModule" android:value="GlideModule"/>

Nada está funcionando hasta ahora. ¿Alguna idea?

Intentamos utilizar un imageView invisible de 1 dp, pero el resultado es el mismo:

for(Drawing drawing: getDrawingsForTab(tab)){ Glide.with(this) .load(drawing.getImage().toUri()) .dontAnimate() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(mPreloadCacheIv); for(Picture picture : getPictures()){ Glide.with(this) .load(picture.getPicture().toUri()) .dontAnimate() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(mPreloadCacheIv); } }


La mejor opción es manejar el almacenamiento en caché usted mismo, le da más control y debería ser fácil, ya que ya sabe qué mapas de bits deben cargarse.

Primero: Configurar un LruCache

LruCache<String, Bitmap> memCache = new LruCache<>(size) { @Override protected int sizeOf(String key, Bitmap image) { return image.getByteCount()/1024; } };

Segundo: Cargar los mapas de bits en el LruCache

Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; //width of screen in pixels int height = size.y;//height of screen in pixels Glide.with(context) .load(Uri.parse("file:///android_asset/imagefile")) .asBitmap() .fitCenter() //fits given dimensions maintaining ratio .into(new SimpleTarget(width,height) { @Override public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { memCache.put("imagefile", resource); } });

Tercero: usar los mapas de bits en caché

Bitmap image = memCache.get("imagefile"); if (image != null) { //Bitmap exists in cache. imageView.setImageBitmap(image); } else { //Bitmap not found in cache reload it Glide.with(context) .load(Uri.parse("file:///android_asset/imagefile")) .into(imageView); }


Usa el siguiente código para almacenar imágenes en caché sin mostrarlas

  1. utilizando el método downloadOnly si desea descargar imágenes de la web y almacenarlas en el diskCache:

    FutureTarget<File> future = Glide.with(applicationContext) .load(yourUrl) .downloadOnly(500, 500);

  2. utilizando el método de preload si desea cargarlos en la memoria caché.

    Glide.with(context) .load(url) .preload(500, 500);

Más tarde puede utilizar las imágenes en caché utilizando

Glide.with(yourFragment) .load(yourUrl) .into(yourView);


//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.después de realizar estos trabajos, cargue un mapa de bits desde diskCache, solo toma 10ms