图片的三级缓存代码案例

图片的三级缓存

主要下载代码:


public class ImageLoader {

    private static final String TAG = "ImageLoader";
    private static ImageLoader imagerLoader;

    private ExecutorService executorService;
    private LruCache<String,Bitmap> cache;
    private ImageLoader(){
        executorService = Executors.newSingleThreadExecutor();
        int i  =(int) (Runtime.getRuntime().maxMemory() / 10);
        cache = new LruCache<String,Bitmap>(i){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }
    public static ImageLoader getInstance(){
        if (imagerLoader == null){
            synchronized (ImageLoader.class){
                if(imagerLoader == null){
                    imagerLoader = new ImageLoader();
                }
            }
        }
        return imagerLoader;
    }

    //下载和缓存逻辑
    public void loading(final String url){
        //图片名称
//        http://www.qubaobei.com/ios/cf/uploadfile/132/9/8289.jpg
        final String name = url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."));
        //1内存
        Bitmap bitmap = cache.get(name);
        if(bitmap !=null){
            //用
            myListener.load(bitmap);
            Log.i(TAG, "loading: 内存读取");
        }else{
            //内存没有.sd读取
            //还没有创建文件.
///storage/emulated/0/fengimage/8289.jpg
            File path = new File(Environment.getExternalStorageDirectory()+File.separator+"fengimage"+File.separator);
            Bitmap bitmapsd = null;
            try {
                FileInputStream fileInputStream = new FileInputStream(new File(path, name));
                bitmapsd = BitmapFactory.decodeStream(fileInputStream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            if(bitmapsd != null){
                Log.i(TAG, "loading: 从sd读取");
//               //sd
                myListener.load(bitmapsd);
                //放入到内存
                cache.put(name,bitmapsd);
            }else{
                //3 网络上
            //主
            final Handler handler = new Handler(){
                @Override
                public void handleMessage(@NonNull Message msg) {
                    super.handleMessage(msg);
                    Bitmap bitmap1 = (Bitmap) msg.obj;
                    myListener.load(bitmap1);
                }
            };

               executorService.execute(new Runnable() {
                   @Override
                   public void run() {
                       try {
                           Log.i(TAG, "run: 从网络下载");
                           URL url1 = new URL(url);
                           HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection();
                           if (urlConnection.getResponseCode() == 200){
                               InputStream inputStream = urlConnection.getInputStream();
                               Bitmap bitmap1 = BitmapFactory.decodeStream(inputStream);

                               //存sd
                               //sd存在.
                               saveToSD(bitmap1, name);

                               //存内存.
                               cache.put(name,bitmap1);

                               Message obtain = Message.obtain();
                               obtain.obj = bitmap1;
                               handler.sendMessage(obtain);
//                               myListener.load(bitmap1);


                           }else{
                               Log.i(TAG, "run: 没网");
                           }
                       } catch (MalformedURLException e) {
                           e.printStackTrace();
                       } catch (IOException e) {
                           e.printStackTrace();
                       }
                   }
               });



            }
        }

    }

    //c + a + m
    private void saveToSD(Bitmap bitmap1, String name) throws FileNotFoundException {
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//                                   /storage/emulated/0/fengimage/
            File path = new File(Environment.getExternalStorageDirectory()+File.separator+"fengimage"+File.separator);
            if(!path.exists()){
                path.mkdirs();
            }

            FileOutputStream fileOutputStream = new FileOutputStream(new File(path, name));
            bitmap1.compress(Bitmap.CompressFormat.JPEG,100,fileOutputStream);

        }else{
            Log.i(TAG, "run: 没有sd卡");
        }
    }

    public interface MyListener{
        void load(Bitmap bitmap);
    }

    private MyListener myListener; //空

    public void setMyListener(MyListener myListener) {
        this.myListener = myListener;
    }
}

页面使用方法

public class MainActivity extends AppCompatActivity implements ImageLoader.MyListener {
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView) findViewById(R.id.img);

        ImageLoader.getInstance().setMyListener(this);
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},100);
    }

    public void click(View view) {
        ImageLoader.getInstance().loading("http://www.qubaobei.com/ios/cf/uploadfile/132/9/8289.jpg");
//        img.setImageBitmap();
    }

    @Override
    public void load(Bitmap bitmap) {
        img.setImageBitmap(bitmap);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容