android - para - Deslizar carga de imagen con contexto de aplicación
herramientas de android studio pdf (1)
Estoy usando glide para cargar imágenes en mi aplicación de Android, para evitar bloqueos, estoy cargando imágenes con el contexto de la aplicación. ¿Cuál será el efecto de esto en el rendimiento de la aplicación y la memoria?
¿Cuál será el efecto de esto en el rendimiento de la aplicación y la memoria?
Glide proporciona muchos métodos
.with()
por una razón: sigue el ciclo de vida.
Imagine un
Fragment
que se agrega dinámicamente a una actividad.
En su método
onCreateView
, inicia una carga de deslizamiento de una imagen de 3 MB.
Ahora, ¿qué sucede si el usuario presiona el botón de retroceso y se elimina el Fragmento o se cierra toda la actividad?
-
Si usa
with(getActivity().getApplicationContext())
no sucederá nada, todos los 3 MB de datos se descargan y luego se decodifican, almacenan en caché, probablemente incluso se configuran en ImageView, que luego se recolecta basura, porque la única referencia fue Glide interno. -
Si usa
with((Fragment)this)
Glide se suscribe a los eventos del ciclo de vida del Fragment y tan pronto como se detiene el Fragment, cualquier solicitud pendiente debe pausarse; y cuando se destruye, se borran todas las solicitudes pendientes. Esto significa que la descarga de la imagen se detendrá a mitad de camino y ese Fragmento muerto no usará más recursos. -
Si usa
with(getActivity())
Glide se suscribe a los eventos del ciclo de vida de la Actividad y sucede lo mismo que antes, pero solo cuando la Actividad se detiene o se destruye.
¡Así que la mejor práctica es utilizar el contexto / fragmento más cercano posible para evitar que se completen las solicitudes no utilizadas!
(También hay una forma manual de detener una carga:
Glide.clear(ImageView|Target)
.
Para aplicar esto en la práctica, intente usar
with(this)
cuando sea posible, pero cuando no lo sea, como en un adaptador o un método de carga de imágenes centralizado, pase un
RequestManager glide
como argumento y use
glide.load(...
, por ejemplo:
static loadImage(RequestManager glide, String url, ImageView view) {
glide.load(url).into(view);
}
o en adaptador:
class MyAdapter extends WhichEveryOneYouUse {
private final RequestManager glide;
MyAdapter(RequestManager glide, ...) {
this.glide = glide;
...
}
void getView/onBindViewHolder(... int position) {
// ... holder magic, and get current item for position
glide.load... or even loadImage(glide, item.url, holder.image);
}
}
y usarlos de Activity / Fragment:
loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));