代码之家  ›  专栏  ›  技术社区  ›  Paul Ledger

从缓存中存储和加载图像,图像将存储但不会加载

  •  0
  • Paul Ledger  · 技术社区  · 9 年前

    我有从服务器下载图像或图像集并显示它们的功能。这部分工作正常,但我想将它们存储在缓存中,以使用应用程序保存用户数据。

    我已经跟踪了 this 将缓存过程合并到我现有的函数中。

    这是我的imageload类:

    package ui;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.widget.ImageButton;
    import android.widget.ImageView;
    
    import java.io.InputStream;
    import java.net.URL;
    import java.util.Collections;
    import java.util.Map;
    import java.util.WeakHashMap;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * Created by paul on 15/08/2015.
     */
    public class loadImage extends AsyncTask<String, String, Bitmap> {
    
        private Bitmap bitmap = null;
        private String type = "";
        private ImageView imageView = null;
        private ImageButton imageButton = null;
        public int size = 0;
        public boolean cache = true;
        private Map<ImageButton, String> imageViewBtn;
        private Map<ImageView, String> imageViewView;
        private ExecutorService executorService;
        private FileCache fileCache;
        private MemoryCache memoryCache;
        private String url = "";
    
        public loadImage (String type, Object object, Context context){
            memoryCache = new MemoryCache();
            if(type.equalsIgnoreCase("imagebutton")){
                imageButton = (ImageButton) object;
                imageViewBtn = Collections.synchronizedMap(new WeakHashMap<ImageButton, String>());
            } else {
                imageView = (ImageView) object;
                imageViewView = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());
            }
            fileCache = new FileCache(context);
            executorService = Executors.newFixedThreadPool(5);
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //add loader as BG
        }
        @Override
        protected Bitmap doInBackground(String... params) {
            //check if cache is true
            url = params[0];
            try {
                bitmap = BitmapFactory.decodeStream((InputStream) new URL(url).getContent());
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bitmap;
    
        }
        protected void onPostExecute(Bitmap image) {
            if(size != 0){
                image = Bitmap.createScaledBitmap(image, size, size, false);
            }
            if(type.equalsIgnoreCase("imagebutton")){
                imageButton.setImageBitmap(image);
                imageViewBtn.put(imageButton, url);
            } else {
                imageButton.setImageBitmap(image);
                imageViewBtn.put(imageButton, url);
            }
            memoryCache.put(url,image);
        }
    
        public boolean cache(String url) {
            bitmap = memoryCache.get(url);
            if(bitmap != null) {
                Log.d("CACHE", "Image loaded from cache");
                if(type.equalsIgnoreCase("imagebutton")){
                    imageButton.setImageBitmap(bitmap);
                } else {
                    imageButton.setImageBitmap(bitmap);
                }
                return true;
            }
            return false;
        }
    }
    

    在我的日志中,它显示图像存储在缓存中,但当我检查设备设置时,缓存数量从未改变。我怎样才能让它发挥作用。

    该类的名称如下:

    //activity is the activity so ie login.this or whatever activity im currently in
    ImageButton pp = (ImageButton) custom.findViewById(R.id.search_pp);
    loadImage loadImage = new loadImage("imagebutton", pp, activity);
    if (!loadImage.cache(thumb)) {
       loadImage.execute(thumb);
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Sina KH    9 年前

    我建议您访问这些准备好的开源库:

    https://github.com/square/picasso

    https://github.com/nostra13/Android-Universal-Image-Loader

    并建议您使用简单的peasy…:D

        2
  •  0
  •   Aveek    7 年前

    你也可以试试 Glide .

    赞成的意见:

    • 非常容易使用
    • 图像缓存机制是自动的
    • 轻量的