使用新式LruCache取代SoftReference缓存图片,Android异步加载图片

简介: import java.io.InputStream;import java.net.URL;import android.

import java.io.InputStream;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.LruCache;
import android.util.Log;

public class AsyncImageLoader {
 
 /**
  * 使用新式的LruCache取代SoftReference缓存图片,异步加载图片。
  * 
  * 备注:图片的URL作为缓存图片时LruCache的 Key
  * */
 
 private final int CACHE_SIZE = 4 * 1024 * 1024; // 4MiB
 private final int MESSAGE_WHAT = 201;
 
 private LruCache<String, Bitmap> mMemoryCache;

    public AsyncImageLoader() {     
       mMemoryCache = new LruCache<String, Bitmap>(CACHE_SIZE) {
        @Override
              protected int sizeOf(String key, Bitmap value) {
                  return value.getRowBytes() * value.getHeight();
               }};
    }
        
    
        public Bitmap loadBitmap(final String imageUrl, final ImageLoadedListener imageLoadedListener) 
        {
         final Handler handler = new Handler() {
          
             @Override
                public void handleMessage(Message message) {
              
              switch(message.what)
              {
               case MESSAGE_WHAT:
                imageLoadedListener.imageLoaded((Bitmap) message.obj, imageUrl);
              }
                }
            };
         
            if (mMemoryCache.get(imageUrl)!=null) {
             Log.d(this.getClass().getName(),"发现图片缓存,从缓存中读取!");
             
             Bitmap bmp = mMemoryCache.get(imageUrl);
                
                Message message = handler.obtainMessage();
                message.what=MESSAGE_WHAT;
                message.obj=bmp;
                handler.sendMessage(message);
                
                return bmp;
            }
           
            Log.d(this.getClass().getName(),"图片没有缓存,从网络加载!");
            
            new Thread() {
                @Override
                public void run() {
                    Bitmap bmp = loadBitmapFromUrl(imageUrl);
                    mMemoryCache.put(imageUrl, bmp);
                    
                    Message message = handler.obtainMessage();
                    message.what=MESSAGE_WHAT;
                    message.obj=bmp;
                    handler.sendMessage(message);
                }
            }.start();
            
            return null;
        }
     
        
       public static Bitmap loadBitmapFromUrl(String url) {
        
        Log.d("AsyncImageLoader.loadBitmapFromUrl()","Loading -> "+url);
        
           InputStream is = null;
           try {
               is = (InputStream) new URL(url).getContent();
           } catch (Exception e) {
               e.printStackTrace();
           } 
           
           Bitmap bmp=BitmapFactory.decodeStream(is); 
           return bmp;
       }
     
        public interface ImageLoadedListener {
            public void imageLoaded(Bitmap bitmap, String url);
        }
}

相关文章
|
3月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
27天前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
87 53
|
4月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
45 2
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
80 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
存储 缓存 监控
网站的图片资源是否需要设置缓存?
【10月更文挑战第18天】网站的图片资源一般是需要设置缓存的,但要根据图片的具体特点和网站的需求,合理设置缓存时间和缓存策略,在提高网站性能和用户体验的同时,确保用户能够获取到准确、及时的图片信息。
|
3月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
72 20
Android经典面试题之图片Bitmap怎么做优化
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
77 8
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
143 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
4月前
|
存储 缓存 算法
缓存优化利器:5分钟实现 LRU Cache,从原理到代码!
嗨,大家好!我是你们的技术小伙伴——小米。今天带大家深入了解并手写一个实用的LRU Cache(最近最少使用缓存)。LRU Cache是一种高效的数据淘汰策略,在内存有限的情况下特别有用。本文将从原理讲起,带你一步步用Java实现一个简单的LRU Cache,并探讨其在真实场景中的应用与优化方案,如线程安全、缓存持久化等。无论你是初学者还是有一定经验的开发者,都能从中受益。让我们一起动手,探索LRU Cache的魅力吧!别忘了点赞、转发和收藏哦~
111 2
|
4月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。