关于Bitmap的加载(二)

  接上节,上节记录了Bitmap的加载,用上节的方法,我们可以方便地压缩图片,进行加载。

  然而,有时候,当出来大量的图片或者是一张大图要加载时,这一过程所花的时间就会显得很长。甚至长到用户可以感觉出来,即UI的卡顿。因此,我们需要一个方法让图片自己加载去吧,不能干扰用户的操作。所以,我们需要用一个新的线程来完成图片加载的操作。其中最简单便捷的方法,就是Use an AsyncTask

  首先创建一个AsyncTask的子类:

    class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
        private final WeakReference<ImageView> imageViewReference;
        private int data = 0;
        private int width , height;
        public BitmapWorkerTask(ImageView imageView , int width , int height) {
            // Use a WeakReference to ensure the ImageView can be garbage collected
            imageViewReference = new WeakReference<ImageView>(imageView);
            this.width = width;
            this.height = height;
        }
        // Decode image in background.
        @Override
        protected Bitmap doInBackground(Integer... params) {
            data = params[0];
            return decodeSampledBitmapFromResource(getResources(), data, width, height);
        }
        // Once complete, see if ImageView is still around and set bitmap.
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            if (imageViewReference != null && bitmap != null) {
                final ImageView imageView = imageViewReference.get();
                if (imageView != null) {
                    imageView.setImageBitmap(bitmap);
                }
            }
        }
    }

  其中,第一个参数是需要加载的图片的Id;

  PS:WeakReference<ImageView> imageViewReference 为弱引用。  

  • WeakReference may be cleared and enqueued as soon as is known to be weakly-referenced.

  当GC启动时弱引用会自动被回收,这里使用弱引用,防止了内存溢出。

  然后,创建这个加载图片类的对象,并在合适的时候执行这个异步任务。

        testButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int width = gridLayout.getWidth()/50;
                int height = gridLayout.getHeight()/50;
                Toast.makeText(getApplicationContext(),width+","+height,Toast.LENGTH_SHORT).show();
                BitmapWorkerTask task = new BitmapWorkerTask(imageView1,width,height);
                task.execute(R.drawable.ic_launcher_big);
            }
        });

  以上。

  然而,这也是有缺陷的。有时候我们需要加载的不只一张图。为了在存在多张图可能需要加载时,不影响系统的效率。组件回收器会在用户滑动屏幕时进行回收,将不出现在用户视野中的界面回收掉。在上面的方法中,每次加载都需要重开一个AsyncTask。有可能这张图还没有加载完,用户已经把这张图滑走了,我们需要用内存加载下一张图了。怎么处理?下回再写吧。。。

时间: 2024-10-15 05:16:17

关于Bitmap的加载(二)的相关文章

Android 基础 十二 Bitmap的加载和Cache

本章的主题是Bitmap的加载和Cache,主要包含三个方面的内容.首先讲述如何有效地加载一个Bitmap,这是一个很有意义的话题,由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16MB,这导致Bitmap加载的时候很容易出现内存溢出.下面这个异常信息在开发中应该经常遇到: 因此如何高效的加载Bitmap是一个很重要也很容易被开发者或忽视的问题. 接着介绍Android中常用的缓存策略,缓存策略是一种通用的思想,可以用在很多场景中,但是实际开发中经常需要用Bitmap

Android艺术——Bitmap高效加载和缓存(1)

通过Bitmap我们可以设计一个ImageLoader,实现应该具有的功能是: 图片的同步加载:图片的异步加载:图片的压缩:内存缓存:磁盘缓存:网络获取: 1.加载 首先提到加载:BitmapFactory类提供了四类方法:decodeFile.decodeResource.decodeStream和decideByteArray.分别是文件系统.资源.输入流和字节数加载Bitmap对象. 2.压缩 如何进行图片的压缩?首先我们为什么图片压缩呢?因为很多时候ImageView尺寸小于图片原始尺寸

Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图 场景图的一部分可以被保存为一个预设,prefab. 有时候我们会需要用预设去复用,而预设的加载似乎只能通过AB去打包,其实不然,这里我们有一个开源的库就可以解决这个问题. 为什么不使用AB,可以见上一篇,加载(一),不使用AB一份资源全平台

Android艺术——Bitmap高效加载和缓存代码分析(2)

Bitmap的加载与缓存代码分析: 图片的压缩 比如有一张1024*768像素的图像要被载入内存,然而最终你要用到的图片大小其实只有128*96,那么我们会浪费很大一部分内存,这显然是没有必要的,下面是一个实例: public static int calculateInSampleSize(              BitmapFactory.Options options, int reqWidth, int reqHeight) {      // Raw height and widt

关于Bitmap的加载(一)

Android中的Bitmap的加载,为了更好的用户体验,有非常多的奇巧淫技.要达到的目的是,一边加载一边看,不卡屏.图片根据布局大小显示.如果图片大了,要合理的缩小,防止内存溢出. 于是,我把Android training的讲解记录下来. 首先,是单一图片的加载. 单一图片,加载最首要的问题是判断图片的大小.如果图片过大,我们需要对图片进行一定比例的压缩. 先通过图片本身的宽高和要求的宽高,计算图片的缩放比例. public static int calculateInSampleSize(

Bitmap 的加载和 Cache

Android 中如何高效地加载 Bitmap 是一个很重要也很容易被我们忽视的问题. Bitmap 的高效加载 BitmapFactory 类提供了:decodeFile.decodeResource.decodeStream.decodeByteArray 以及 decodeFileDescriptor 等几类方法来加载一个 Bitmap 对象. 高效加载 Bitmap 的核心思想就是设置 BitmapFactory.Options 的 inSampleSize 采样率属性来加载所需尺寸的图

Bitmap的加载和Cache

前提:由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,导致加载Bitmap的时候很容易出现内存溢出. 下面这个一场信息在开发中应该市场遇到: java.lang.OutofMemoryError: bitmap size exceeds VM budget Android实际开发中经常需要用Bitmap做缓存,通过换粗策略,我们不需要每次都从网络上请求图片或者从存储设备中加载图片,这样就极大地提高了图片的加载效率以及产品的用户体验. 目前比较常用的缓存策略是LruCache

第12章 Bitmap的加载和Cache

高效加载 BitmapFactory类提供四种方法: decodeFile:从文件,间接调用decodeStream decodeResource:从资源,间接调用decodeStream decodeStream:输入流 decodeByteArray:字节数组中 使用BitmapFactory.options按一定采样率来加载缩小后图片来避免OOM. public class ImageResizer { private static final String TAG = "ImageRes

Android之Bitmap 高效加载

一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 图片格式(Bitmap.Config) 一张100*100的图片占用内存的大小 ALPHA_8 图片长度*图片宽度 100*100=10000字节 ARGB_4444 图片长度*图片宽度*2 100*100*2=20000字节 ARGB_8888 图片长度*图片宽度*4 100*100*4=40000字节 RGB_565 图片长度*图片宽度*2 100*100*2=20000字节 减小图片内存的方式只有改变,图片的格式