imageloader - ¿Cómo forzar un borrado de caché utilizando Universal Image Loader Android?
picasso android developer (3)
Estoy usando UIL para cargar imágenes en una vista de lista.
Cuando pulso una imagen en la vista de lista, muestro un cuadro de diálogo para modificar esa imagen, reemplazándola por una nueva con la cámara.
Si tomo una nueva imagen, cuando se descarta el cuadro de diálogo, mi vista de lista aún muestra la imagen anterior (ya que está almacenada en caché). Si cierro y reinicio mi aplicación cuando voy a mi vista de lista, la nueva imagen está allí correctamente.
Así es como configuro UIL:
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
//set display options for image loader
DisplayImageOptions displayOptions = new DisplayImageOptions.Builder()
.cacheInMemory()
.displayer(new FadeInBitmapDisplayer(500)) //fade in images
.resetViewBeforeLoading()
.build();
//set image loader options
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).defaultDisplayImageOptions(displayOptions).build();
// Initialize ImageLoader with configuration.
imageLoader.init(config);
Si .cacheInMemory()
todo funciona bien. Me pregunto si puedo borrar la memoria caché cuando solo abro mi diálogo. Intenté obtener el ImageView seleccionado y llamé a myImageView.invalidate()
al abrir el cuadro de diálogo sin éxito.
Las imágenes se cargan desde el archivo:
// Load and display image asynchronously
imageLoader.displayImage(file_prefix + image_path, image);
¿Alguna sugerencia?
Editar: código para crear un menú contextual cuando se presiona una imagen durante un tiempo, traté de borrar el caché allí:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//get info about item selected
AdapterView.AdapterContextMenuInfo info;
try {
// Casts the incoming data object into the type for AdapterView objects.
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
// If the menu object can''t be cast, logs an error.
Log.e("no info", "bad menuInfo", e);
return;
}
Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
if (cursor == null) {
// For some reason the requested item isn''t available, do nothing
return;
}
//remove selected image from cache (if it is an image)
imageUrl = cursor.getString(cursor.getColumnIndex("image_path"));
if (!imageUrl.equalsIgnoreCase("")) {
MemoryCacheUtil.removeFromCache(imageUrl, imageLoader.getMemoryCache());
}
Log.i("imageUrl", imageUrl);
//get defect row ID and text content to pass it to defect activity
defect_row_id = cursor.getLong(cursor.getColumnIndex("_id"));
defect_txt = cursor.getString(cursor.getColumnIndex("defect"));
MenuInflater inflater = getMenuInflater();
Log.i("cursor", DatabaseUtils.dumpCursorToString(cursor));
//set project identifier in context menu header, mapping cursor sequence of values
menu.setHeaderTitle(getString(R.string.select_an_option));
inflater.inflate(R.menu.menu_defect_row, menu);
}
Cuando se selecciona un elemento del menú (editar o eliminar)
@Override
public boolean onContextItemSelected(MenuItem item) {
//AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
//open defect activity with the specified image and defect pre-loaded
Intent editDefectIntent = new Intent(this, DefectActivity.class);
editDefectIntent.putExtra("defect_row_id", defect_row_id);
editDefectIntent.putExtra("imageUrl", imageUrl);
startActivity(editDefectIntent);
return true;
case R.id.delete:
askDeleteConfirm();
return true;
default:
return false;
}
}//onContextItemSelected
Edición: código para mostrar la lista de imágenes
@Override
public void onResume() {
super.onResume();
//open connection to db
db = new DBAdapter(this);
db.open();
Log.i("DefectListActivity -> onResume", "called");
// get all defects for this unit
defectList = db.getAllDefectsByUnit(unit_id);
// create an array adapter and let it to display our row
defects = new SimpleCursorAdapter(this, R.layout.defect_row, defectList, new String[] { "defect", "image_path" }, new int[] { R.id.defect, R.id.image }, 0);
//set custom view using ViewBinder
SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName());
//get column name
String name = cursor.getColumnName(columnIndex);
//for the thumbnail column,if we have an image replace the placeholder
if ("image_path".equals(name)) {
ImageView image = (ImageView) view.findViewById(R.id.image);
//Bitmap thumbnail;
String image_path = cursor.getString(columnIndex);
Log.i("image_path ->", image_path);
if (!image_path.equalsIgnoreCase("")) {
// Load and display image asynchronously
imageLoader.displayImage(file_prefix + image_path, image);
} else {
image.setImageResource(placeholder_id);
}
return true;
}
//for the defect column, just add the text to the view
if ("defect".equals(name)) {
String defect_text = cursor.getString(columnIndex);
TextView defect_holder = (TextView) view.findViewById(R.id.defect);
defect_holder.setText(defect_text);
return true;
}
return false;
}
};
defects.setViewBinder(binder);
setListAdapter(defects);
}//onResume
Creo que deberías eliminar la imagen en caché en la memoria caché al abrir el diálogo. Use MemoryCacheUtil
para eso:
MemoryCacheUtils.removeFromCache(imageUrl, imageLoader.getMemoryCache());
Esto debería funcionar:
imageLoader.clearMemoryCache();
Si lo almacena en la memoria caché y en el disco, por ejemplo:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
.discCache(new UnlimitedDiscCache(cacheDir))
.........
Asegúrate de eliminarlo de ambos, luego vuelve a cargar la vista de imagen.
MemoryCacheUtils.removeFromCache(url, ImageLoader.getInstance().getMemoryCache());
DiscCacheUtils.removeFromCache(url, ImageLoader.getInstance().getDiscCache());