2012-12-21 7 views
17

Ich verwende UIL, um Bilder in einer Listview zu laden.Wie erzwingen Sie eine Cache-Löschung mit Universal Image Loader Android?

Wenn ich ein Bild lange in der Listenansicht drücke, blicke ich auf einen Dialog, um das Bild zu ändern und es durch ein neues zu ersetzen.

Wenn ich ein neues Bild mache, wenn der Dialog geschlossen wird, zeigt meine Listview immer noch das alte Bild (da es zwischengespeichert ist). Wenn ich meine Anwendung schließe und neu starte, wenn ich zu meinem Listenansicht gehe, ist das neue Bild korrekt dort. obwohl entfernen .cacheInMemory() alles funktioniert

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

Wenn ich:

Dies ist, wie ich UIL eingerichtet. Ich frage mich nur, ob ich den Cache löschen kann, wenn ich nur meinen Dialog öffne. Ich habe versucht, den ausgewählten ImageView zu erreichen und myImageView.invalidate() aufzurufen, wenn ich den Dialog ohne Erfolg öffne.

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

Irgendwelche Vorschläge:

werden die Bilder aus einer Datei geladen?

Edit: Code, um ein Kontextmenü zu erstellen, wenn lange ein Bild drücken, habe ich versucht, es den Cache zu löschen:

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

} 

Wenn ein Menüpunkt (bearbeiten oder löschen) ausgewählt ist

@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 

Edit: Code Liste der Bilder angezeigt werden

@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 

Antwort

10

ich glaube, Sie im Speicher-Cache-Cache gespeicherten Bild löschen sollten beim Öffnen des Dialogs. Verwenden Sie MemoryCacheUtil dafür:

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

Ich habe versucht, es funktioniert nicht. Ich öffne ein Kontextmenü, dann einen Dialog. Ich habe diese Zeilen zu meinem 'onCreateContextMenu' hinzugefügt, aber es macht nichts. Ich habe auch versucht, die Bild-URL an den Dialog zu übergeben und den Cache von dort zu befreien, um den imageLoader Singleton zu erhalten, immer noch derselbe. – Mirko

+0

Rufen Sie '' 'imageLoader.displayImage (file_prefix + image_path, image);' '' nach dem Ersetzen des Bildes durch ein neues mit der Kamera auf? – NOSTRA

+0

eigentlich vor, beim Öffnen des Dialogs – Mirko

20

Dies sollte funktionieren:

imageLoader.clearMemoryCache(); 
+7

Löschen des Speichercaches: 'imageLoader.clearMemoryCache();' und Löschen des Diskcaches: 'imageLoader.clearDiscCache();' – hannanessay

27

Wenn Sie es sowohl im Speicher und Disk cachen, zum Beispiel:

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

Stellen Sie sicher, Sie es von beiden entfernen von ihnen, dann laden Sie Ihre Bildansicht neu.

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

Sie haben mir gerade das Leben gerettet. – idish

+2

Ich habe 'DiscCacheUtils' weder' getDiscCache' gefunden. Ich glaube, dass Sie "DiskCacheUtils" sagen wollten "getDiskCache" – Antonio

+1

Ich war in der älteren Version der Bibliothek, ich bin aktuell mit 'ImageLoader.getInstance(). GetDiscCache() ImageLoader.getInstance(). GetMemoryCache() ' Und' DiscCacheUtil' ist immer noch da für Version 1.9. + Ich glaube. – Bundeeteddee