使用新式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);
        }
}

相关文章
|
4月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
2月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
34 2
|
3月前
|
Java Android开发
Android面试题经典之Glide取消加载以及线程池优化
Glide通过生命周期管理在`onStop`时暂停请求,`onDestroy`时取消请求,减少资源浪费。在`EngineJob`和`DecodeJob`中使用`cancel`方法标记任务并中断数据获取。当网络请求被取消时,`HttpUrlFetcher`的`cancel`方法设置标志,之后的数据获取会返回`null`,中断加载流程。Glide还使用定制的线程池,如AnimationExecutor、diskCacheExecutor、sourceExecutor和newUnlimitedSourceExecutor,其中某些禁止网络访问,并根据CPU核心数动态调整线程数。
94 2
|
25天前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
44 20
Android经典面试题之图片Bitmap怎么做优化
|
19天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
41 8
|
2月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
2月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
145 4
|
2月前
|
存储 缓存 Java
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
Android项目架构设计问题之优化业务接口数据的加载效率如何解决
35 0
|
2月前
|
Java Android开发 Kotlin
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
Android项目架构设计问题之要在Glide库中加载网络图片到ImageView如何解决
26 0