画像のダウンロードに Volleys ライブラリを使用しています。ユーザーがプロフィール画像を変更すると、画像をサーバーにアップロードして前の画像を置き換えます。データベースでユーザーの ID を使用しているため、プロフィール画像へのリンクは常に同じです。
私がキャッシュで抱えている問題は、ネットワークイメージビューの画像を置き換えたいリンクでサーバーが成功した応答を返した後、キャッシュ内のビットマップを置き換えることができないことですが、それはうまくいかないようです. これが私のLruImageCacheクラスです
public class LruBitmapCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache {
public static int getDefaultLruCacheSize() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8;
return cacheSize;
}
public LruBitmapCache() {
this(getDefaultLruCacheSize());
}
public LruBitmapCache(int sizeInKiloBytes) {
super(sizeInKiloBytes);
}
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
@Override
public Bitmap getBitmap(String url) {
return get(url);
}
public void clear(){
this.clear();
}
public void removeBitmap(String key){
this.remove(key);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap);
}
}
私はこのように私のAppControllerにクラスを持っています
public class AppController extends Application {
public static final String TAG = AppController.class
.getSimpleName();
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private LruImageCache lruBitmapCache;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
lruBitmapCache = new LruImageCache();
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
mImageLoader = new ImageLoader(this.mRequestQueue, lruBitmapCache);
}
return this.mImageLoader;
}
public LruImageCache getLruBitmapCache() {
return lruBitmapCache;
}
}
画像を完全にアップロードし、サーバーから返された URL を取得した後、この行を使用しようとしましたが、機能しませんでした
Image.setImageUrl(new_url, AppController.getInstance().getImageLoader());
また、LruCache を呼び出してキャッシュからビットマップを削除しようとしたため、画像を再度設定しましたが、どちらも機能していないようです。
AppController.getInstance().getLruBitmapCache().remove(new_url);
また、別の方法を使用してビットマップを手動でダウンロードし、new_url をキーとして使用してキャッシュに入れようとしましたが、まだ機能しません。
AppController.getInstance().getLruBitmapCache().put(new_url, newBitmap)
新しいアップロードされた画像ファイルをロードするように、キャッシュ内のビットマップを置き換えるにはどうすればよいですか? 画像ファイルを開いて置き換えられていることを確認できるので、画像ファイルがサーバーにアップロードされていることは確かです。現時点で機能する唯一の方法は、アプリを閉じて再度開くことです。