如何使用Universal Image Loader Android强制清除caching?

我正在使用UIL加载列表视图中的图像。

当我在列表视图中长按一个图像时,我会显示一个对话框来修改该图片,使用相机replace为新图片。

如果我拍摄一张新照片,当对话框被解除时,我的列表视图仍然显示旧图像(因为它被caching)。 如果我closures并重新启动我的应用程序,当我去我的列表查看新图像正确的那里。

这是我如何设置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); 

如果我删除.cacheInMemory()一切正常。 我只是想知道,如果我只能打开我的对话框清除caching。 我试图得到所选的ImageView,并调用myImageView.invalidate()打开对话框时没有成功。

图像从文件加载:

 // Load and display image asynchronously imageLoader.displayImage(file_prefix + image_path, image); 

有什么build议么?

编辑:代码来创build一个上下文菜单时长按图像,我试图清除那里的caching:

 @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); } 

当一个菜单项(编辑或删除)被选中

 @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 

编辑:代码来显示图像列表

 @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 

Solutions Collecting From Web of "如何使用Universal Image Loader Android强制清除caching?"

如果您要caching内存和光盘,例如:

 ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) .discCache(new UnlimitedDiscCache(cacheDir)) ......... 

确保从两者中删除它,然后重新加载图像视图。

 MemoryCacheUtils.removeFromCache(url, ImageLoader.getInstance().getMemoryCache()); DiscCacheUtils.removeFromCache(url, ImageLoader.getInstance().getDiscCache()); 

这应该工作:

 imageLoader.clearMemoryCache(); 

我想你应该在打开对话框时删除内存caching中的caching图像。 为此使用MemoryCacheUtil

 MemoryCacheUtils.removeFromCache(imageUrl, imageLoader.getMemoryCache());