-1

下面是我的图像加载器代码,如果新图像名称不同,则工作正常,但如果新图像名称相同,则不更改图像仅显示旧图像假设我有图像名称如果我在 url 中添加具有相同名称的新图像,myimage 将完美显示删除以前我的代码再次显示以前的图像由于缓存不显示新图像此代码中有什么问题请帮助我

    ImageLoader2 imgLoader;
    String url1 = school2.getJSONObject(0).getString("image");
                imgLoader.DisplayImage(url1, img1);






  public class ImageLoader2 {

MemoryCache2 memoryCache=new MemoryCache2();
FileCache2 fileCache;
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new    
WeakHashMap<ImageView, String>());
ExecutorService executorService; 

public ImageLoader2(Context context){
    fileCache=new FileCache2(context);
    executorService=Executors.newFixedThreadPool(5);
 }

 final int stub_id=R.drawable.ic_launcher;
 public void DisplayImage(String url, ImageView imageView)
 {
    imageViews.put(imageView, url);
    Bitmap bitmap=memoryCache.get(url);
    if(bitmap!=null)
        imageView.setImageBitmap(bitmap);
    else
    {
        queuePhoto(url, imageView);
        imageView.setImageResource(stub_id);
    }
 }

 private void queuePhoto(String url, ImageView imageView)
 {
    PhotoToLoad p=new PhotoToLoad(url, imageView);
    executorService.submit(new PhotosLoader(p));
 }

 private Bitmap getBitmap(String url) 
 {
    File f=fileCache.getFile(url);

    //from SD cache
    Bitmap b = decodeFile(f);
    if(b!=null)
        return b;

    //from web
    try {
        Bitmap bitmap=null;
        URL imageUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
        conn.setConnectTimeout(30000);
        conn.setReadTimeout(30000);
        conn.setInstanceFollowRedirects(true);
        InputStream is=conn.getInputStream();
        OutputStream os = new FileOutputStream(f);
        Utils.CopyStream(is, os);
        os.close();
        bitmap = decodeFile(f);
        return bitmap;
    } catch (Throwable ex){
       ex.printStackTrace();
       if(ex instanceof OutOfMemoryError)
           memoryCache.clear();
       return null;
    }
  }

 //decodes image and scales it to reduce memory consumption
 private Bitmap decodeFile(File f){
    try {
        //decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=70;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
 }

 //Task for the queue
 private class PhotoToLoad
 {
    public String url;
    public ImageView imageView;
    public PhotoToLoad(String u, ImageView i){
        url=u; 
        imageView=i;
    }
 }

   class PhotosLoader implements Runnable {
    PhotoToLoad photoToLoad;
    PhotosLoader(PhotoToLoad photoToLoad){
        this.photoToLoad=photoToLoad;
    }

    @Override
    public void run() {
        if(imageViewReused(photoToLoad))
            return;
        Bitmap bmp=getBitmap(photoToLoad.url);
        memoryCache.put(photoToLoad.url, bmp);
        if(imageViewReused(photoToLoad))
            return;
        BitmapDisplayer bd=new BitmapDisplayer(bmp, photoToLoad);
        Activity a=(Activity)photoToLoad.imageView.getContext();
        a.runOnUiThread(bd);
    }
 }

  boolean imageViewReused(PhotoToLoad photoToLoad){
    String tag=imageViews.get(photoToLoad.imageView);
    if(tag==null || !tag.equals(photoToLoad.url))
        return true;
    return false;
 }

 //Used to display bitmap in the UI thread
 class BitmapDisplayer implements Runnable
 {
    Bitmap bitmap;
    PhotoToLoad photoToLoad;
    public BitmapDisplayer(Bitmap b, PhotoToLoad p){bitmap=b;photoToLoad=p;}
    public void run()
    {
        if(imageViewReused(photoToLoad))
            return;
        if(bitmap!=null)
            photoToLoad.imageView.setImageBitmap(bitmap);
        else
            photoToLoad.imageView.setImageResource(stub_id);
    }
   }

 public void clearCache() {
    memoryCache.clear();
    fileCache.clear();
}

 }





         public class MemoryCache2 {

 private static final String TAG = "MemoryCache";
 private Map<String, Bitmap> cache=Collections.synchronizedMap(
        new LinkedHashMap<String, Bitmap>(10,1.5f,true));
 private long size=0;//current allocated size
 private long limit=1000000;//max memory in bytes

  public MemoryCache2(){
    //use 25% of available heap size
    setLimit(Runtime.getRuntime().maxMemory()/4);
 }

 public void setLimit(long new_limit){
    limit=new_limit;
    Log.i(TAG, "MemoryCache will use up to "+limit/1024./1024.+"MB");
 }

 public Bitmap get(String id){
    try{
        if(!cache.containsKey(id))
            return null;

        return cache.get(id);
    }catch(NullPointerException ex){
        ex.printStackTrace();
        return null;
    }
 }

 public void put(String id, Bitmap bitmap){
    try{
        if(cache.containsKey(id))
            size-=getSizeInBytes(cache.get(id));
        cache.put(id, bitmap);
        size+=getSizeInBytes(bitmap);
        checkSize();
    }catch(Throwable th){
        th.printStackTrace();
    }
}

 private void checkSize() {
    Log.i(TAG, "cache size="+size+" length="+cache.size());
    if(size>limit){
        Iterator<Entry<String, Bitmap>> iter=cache.entrySet().iterator();
        while(iter.hasNext()){
            Entry<String, Bitmap> entry=iter.next();
            size-=getSizeInBytes(entry.getValue());
            iter.remove();
            if(size<=limit)
                break;
        }
        Log.i(TAG, "Clean cache. New size "+cache.size());
    }
}

 public void clear() {
    try{

        cache.clear();
        size=0;
    }catch(NullPointerException ex){
        ex.printStackTrace();
    }
}

long getSizeInBytes(Bitmap bitmap) {
    if(bitmap==null)
        return 0;
    return bitmap.getRowBytes() * bitmap.getHeight();
}
 }





     private File cacheDir;

  public FileCache2(Context context){
    //Find the dir to save cached images
    if  (android.os.Environment.getExternalStorageState().equals
 (android.os.Environment.MEDIA_MOUNTED))
        cacheDir=new   
 File(android.os.Environment.getExternalStorageDirectory(),"TTImages_cache");
    else
        cacheDir=context.getCacheDir();
    if(!cacheDir.exists())
        cacheDir.mkdirs();
}

public File getFile(String url){
    //I identify images by hashcode. Not a perfect solution, good for the demo.
    String filename=String.valueOf(url.hashCode());
    //Another possible solution (thanks to grantland)
    //String filename = URLEncoder.encode(url);
    File f = new File(cacheDir, filename);
    return f;

 }

  public void clear(){
    File[] files=cacheDir.listFiles();
    if(files==null)
        return;
    for(File f:files)
        f.delete();
 }

   }
4

2 回答 2

0

使用以下代码进行图像加载:

使用 Android 查询。AQuery 提供了启用或禁用 cahce 的选项,它比任何 ImageLoader 类都非常快且更准确。

您将从以下链接中找到一个查询 jar 文件:

http://code.google.com/p/android-query/

私人 AQuery androidAQuery; androidAQuery = new AQuery(getActivity());

androidAQuery.id(your imageview).image(your image value, true, true,default icon(optional));

于 2013-09-12T10:12:35.283 回答
0

我已经给了它:

http://code.google.com/p/android-query/

根据您在下面给出的代码:

 String url1 = school2.getJSONObject(0).getString("image");

而不是下面的行:

 **imgLoader.DisplayImage(url1, img1);**

将其替换为:

androidAQuery.id(image1).image(url1, true, true,default icon(optional));

Initialize aQuery in your onCreate():

private AQuery androidAQuery; androidAQuery = new AQuery(getActivity());
于 2013-09-12T10:29:13.643 回答