studio imageloader glide developer dependency android universal-image-loader

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());