Android通用图像加载器清除缓存。

4

我使用通用图片加载器从网址加载图片。
这是适配器。

public class BinderDataImg extends BaseAdapter {

static final String KEY_IMG = "img";
LayoutInflater inflater;
List<HashMap<String,String>> imgHashmap;
ViewHolder holder;

ImageLoader imageLoader = ImageLoader.getInstance();

public BinderDataImg(Activity act, List<HashMap<String,String>> map) {
    this.imgHashmap = map;
    inflater = (LayoutInflater) act
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

public int getCount() {
    // TODO Auto-generated method stub
    return imgHashmap.size();
}

public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null){
        vi = inflater.inflate(R.layout.list_img, null);
        holder = new ViewHolder();
        holder.iv_img =(ImageView)vi.findViewById(R.id.imageViewImg);

        vi.setTag(holder);
    }
    else{

        holder = (ViewHolder)vi.getTag();
    }

    String uri = imgHashmap .get(position).get(KEY_IMG);

    imageLoader.displayImage(uri, holder.iv_img);

    return vi;
}

static class ViewHolder{
    ImageView iv_img;
}

}

这是一个活动

List<ClassImg> imgList = null;
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheOnDisk(true).cacheInMemory(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .resetViewBeforeLoading(true)
            .displayer(new FadeInBitmapDisplayer(300))
            .showImageForEmptyUri(R.drawable.hinh_error)
            .showImageOnFail(R.drawable.hinh_internet)
            .showImageOnLoading(R.drawable.hinh_loading)
            .build();

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
            .defaultDisplayImageOptions(defaultOptions)
            .memoryCache(new WeakMemoryCache())
            .threadPoolSize(3)
            .diskCacheSize(100 * 1024 * 1024)
            .build();

    ImageLoader.getInstance().init(config);

    final CustomListView lvi = (CustomListView)findViewById(R.id.listViewHinh);

    try {
        XmlPullParser parser = new XmlPullParser();
        imgList = parser.parse(getAssets().open(file_xml);
        BinderDataImg binderdata = new BinderDataImg(this, imgHashmap);
        lvi.setAdapter(binderdata);

    }catch(IOException e) {
        e.printStackTrace();
    }
}

我可以完美地加载图像并在内存和磁盘中进行缓存。


但是,我希望当活动开始时,缓存将被清除,或者当按下返回按钮离开活动时,缓存将从内存和磁盘中删除。


如何做到这一点?


对于我的糟糕的英语表示抱歉,谢谢阅读。


您不需要手动清除缓存,因为系统会自动为您完成。 - thunder413
https://dev59.com/y2Yr5IYBdhLWcg3wDWFm#19512974 - Chintan Soni
@thunder413:这是正确的吗? - abcd1234
@chintan soni:我已经看到了,但这并不是我要找的完美解决方案。 - abcd1234
2个回答

7
你可以使用DiskCacheUtilsMemoryCacheUtils通过图片url来删除特定的图片。
DiskCacheUtils.removeFromCache(imageUrl, ImageLoader.getInstance().getDiskCache());    
MemoryCacheUtils.removeFromCache(imageUrl, ImageLoader.getInstance().getMemoryCache());

或者完全清除缓存

ImageLoader.getInstance().clearMemoryCache()
ImageLoader.getInstance().clearDiskCache()

当活动创建时清除缓存,您可以在初始化ImageLoader后调用这些方法。

在离开活动时清除缓存,您可以在onDestroy()中调用方法,但我应该注意系统可能会在不调用此方法的情况下终止您的活动。


在活动中的ImageLoader.getInstance().init(config);之后添加第二个解决方案? - abcd1234
你应该查看 https://github.com/nostra13/Android-Universal-Image-Loader/wiki/Useful-Info 上的第四个提示。 - Alex

0

ImageLoader类有两个清除缓存的方法:clearMemoryCacheclearDiscCache。在activity的onDestroy方法中调用它们可以实现你想要的效果。


但是当重新加载活动时,日志窗口会显示“尝试初始化已经在之前初始化过的ImageLoader。要使用新的重新初始化ImageLoader。”这是什么意思?有些图像再次加载并出现了内存不足错误。 - abcd1234
为了避免“已经被初始化”的消息,请将您的配置部分放入一个扩展Application的类中,而不是您的活动。 - Gaëtan Maisse
我不明白,你能解释一下吗? - abcd1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接