LruCache缓存bitmap(三)

应用在网络连接上,onrestart后不会重新联网获取图片,省去了流量,

public class MainActivity extends AppCompatActivity {
    ImageView imageView;
    private LruCache<String, Bitmap> lruCache;
    Bitmap bitmap;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.image);
        long maxMemory = Runtime.getRuntime().maxMemory();
        int cacheSize = (int) (maxMemory / 8);
        lruCache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount();
            }
        };
    }

    class BitmapThread extends Thread {
        private String bitmapUrl;

        BitmapThread(String bitmapUrl) {
            this.bitmapUrl = bitmapUrl;
        }

        @Override
        public void run() {
            Log.i("名字", "run: " + Thread.currentThread().getName());
            Bitmap bitmap3 = null;
            HttpURLConnection connection = null;
            InputStream inputStream = null;
            try {
                URL url = new URL(bitmapUrl);
                connection = (HttpURLConnection) url.openConnection();
                connection.setConnectTimeout(5000);
                connection.setRequestMethod("GET");
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    inputStream = connection.getInputStream();
                    bitmap3 = BitmapFactory.decodeStream(inputStream);

                }

                handler.obtainMessage(1, bitmap3).sendToTarget();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Log.i("线程名字", "hanlder handleMessage: " + Thread.currentThread().getName());
            switch (msg.what) {
                case 1:
                    bitmap = (Bitmap) msg.obj;
                    imageView.setImageBitmap(bitmap);
                    lruCache.put("a", bitmap);
                    break;
            }
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        Bitmap bitmap2 = lruCache.get("a");
        if (bitmap2 == null) {
            new BitmapThread("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3453332705,4236610029&fm=26&gp=0.jpg").start();

        } else {
            imageView.setImageBitmap(bitmap2);
        }
    }
}

原文地址:https://www.cnblogs.com/Ocean123123/p/10981355.html

时间: 2024-08-06 22:25:44

LruCache缓存bitmap(三)的相关文章

LruCache缓存bitmap(二)

Lrucache缓存程序关闭缓存自动清除,所以要在onstart方法中调用,只要不关闭程序缓存就在,除以1024是以kb为单位 public class MainActivity extends AppCompatActivity { private LruCache<String, Bitmap> mMemoryCache; ImageView imageView; Bitmap bitmap; int cacheSize; @Override protected void onCreate

让App中加入LruCache缓存,轻松解决图片过多造成的OOM

上次有过电话面试中问到Android中的缓存策略,当时模糊不清的回答,现在好好理一下吧. Android中一般情况下采取的缓存策略是使用二级缓存,即内存缓存+硬盘缓存->LruCache+DiskLruCache,二级缓存可以满足大部分的需求了,另外还有个三级缓存(内存缓存+硬盘缓存+网络缓存),其中DiskLruCache就是硬盘缓存,下篇再讲吧! 1.那么LruCache到底是什么呢? 查了下官方资料,是这样定义的: LruCache 是对限定数量的缓存对象持有强引用的缓存,每一次缓存对象被

让App中增加LruCache缓存,轻松解决图片过多造成的OOM

上次有过电话面试中问到Android中的缓存策略,当时模糊不清的回答,如今好好理一下吧. Android中普通情况下採取的缓存策略是使用二级缓存.即内存缓存+硬盘缓存->LruCache+DiskLruCache.二级缓存能够满足大部分的需求了,另外还有个三级缓存(内存缓存+硬盘缓存+网络缓存),当中DiskLruCache就是硬盘缓存,下篇再讲吧! 1.那么LruCache究竟是什么呢? 查了下官方资料.是这样定义的: LruCache 是对限定数量的缓存对象持有强引用的缓存,每一次缓存对象被

listview+BaseAdapter + AsyncTask异步请求网络 + LruCache缓存图片

1,通过异步加载,避免阻塞UI线程 2,通过LruCache,将已经下载的图片放到内存中 3,通过判断Listview滑动状态,决定何时加载图片 4,不仅仅是listview ,任何控件都可以使用异步加载 代码结构: 布局1, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&qu

AsyncTask异步任务与LruCache缓存策略实现图片加载(一)

AsyncTask异步任务与LruCache缓存策略实现图片加载 AsyncTask异步任务 以下内容节选自官方文档: AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or ha

LruCache缓存处理及异步加载图片类的封装

Android中的缓存处理及异步加载图片类的封装 一.缓存介绍: (一).Android中缓存的必要性: 智能手机的缓存管理应用非常的普遍和需要,是提高用户体验的有效手段之一. 1.没有缓存的弊端: 流量开销:对于客户端——服务器端应用,从远程获取图片算是经常要用的一个功能,而图片资源往往会消耗比较大的流量. 加载速度:如果应用中图片加载速度很慢的话,那么用户体验会非常糟糕. 那么如何处理好图片资源的获取和管理呢?异步下载+本地缓存 2.缓存带来的好处: 1. 服务器的压力大大减小: 2. 客户

Android源代码解析之(七)--&amp;gt;LruCache缓存类

转载请标明出处:一片枫叶的专栏 android开发过程中常常会用到缓存.如今主流的app中图片等资源的缓存策略通常是分两级.一个是内存级别的缓存,一个是磁盘级别的缓存. 作为android系统的维护者google也开源了其缓存方案,LruCache和DiskLruCache.从android3.1開始LruCache已经作为android源代码的一部分维护在android系统中.为了兼容曾经的版本号android的support-v4包也提供了LruCache的维护,假设App须要兼容到andr

LruCache缓存

LruCache通常用于实现内存缓存,采用的缓存算法是LRU(Least Recently Used)即近期最少使用算法,其核心思想是:当缓存满的时候,会优先淘汰那些近期最少使用的缓存对象. 1.LruCache是Android 3.1提供的缓存类,在使用LruCache的时候建议采用support-v4兼容包中提供的LruCache,这样才能兼容Android 2.2版本. 2.LruCache是一个泛型类,内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,当缓存满的时候

android 使用LruCache缓存网络图片

加载图片,图片如果达到一定的上限,如果没有一种合理的机制对图片进行释放必然会引起程序的崩溃. 为了避免这种情况,我们可以使用Android中LruCache来缓存下载的图片,防止程序出现OOM. 打开activity_main.xml作为程序的主布局,加入如下代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.an