Android中图片的异步加载

转:

1、  为什么要异步加载图片

下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验

2、  SoftReference的作用

栈内存—引用

堆内存—对象

Eg:

Object obj = new Object();

Obj = null;

当垃圾收集器启动时,会回收对象;

当一个对象没有任何引用指向,就会被回收。

SoftReference<Object>sr = new SoftReference<Object>(new Obnject());

引用是软引用,当垃圾回收器启动时,系统会判断内存是否充足,内存不足时,即使对象有引用指向,也会被回收。

Object obj = sr.get();获取软引用指向的对象,当已被回收时,返回NULL。

在这里我们使用SoftReference对象来建立图片缓存

3、  异步加载图片的方法

基本流程:

A、 获取图片URL

B、 根据URL查询缓存

Eg:假如取回了20条微博,其中5条微博是同一个人发的,这样这个人的头像就要被取回5次,这是不合理的。

解决方法:把从网络上下载的图片以键值对的方式放到缓存里,键是URL,值是下载的图片,下次再去读取图片时,先看URL是否在缓存里,如果在,就不用下载了。

C、 访问缓存or访问网络

D、 得到图片对象

E、  显示图片

代码示例:

/**
 * 实现图片的异步加载
 * @author Zhu
 *
 */
public class AsyncImageLoader {
    //图片缓存对象,键是URL,值是SoftReference对象,该对象指向一个Drawable对象
    private Map<String,SoftReference<Drawable>> imageCache =
        new HashMap<String,SoftReference<Drawable>>();
    /**
     * 实现图片的异步加载
     * @param imageUrl
     * @return
     */
    public Drawable loadDrawable(final String imageUrl){
        //查询缓存,查看当前要下载的图片是否已经在缓存中
        if(imageCache.containsKey(imageUrl)){
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);
            if(softReference.get()!=null){
                return softReference.get();//还没被回收
            }
        }
        final Handler handler = new Handler(){

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
                //Handler是与主程序处于同一线程的,在这里可以写加载完图片的处理,显示or存储or...
            }

        };
        //新开辟一个线程
        new Thread(){

            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                Drawable drawable = loadImageFromUrl(imageUrl);
                imageCache.put(imageUrl,new SoftReference<Drawable>(drawable));
                Message message = handler.obtainMessage(0,drawable);
                handler.sendMessage(message);
            }

        }.start();
        return null;
    }
    /**
     * 根据图片的URL从网络上下载图片
     * @param imageUrl
     * @return
     */
    public Drawable loadImageFromUrl(String imageUrl){
        try{
            //根据图片的URL,下载图片,并生成一个Drawable对象
            return Drawable.createFromStream(new URL(imageUrl).openStream(), "src");
                       //另一种下载图片的方法:
                     //  Drawable icon;
                    //  HttpURLConnection hc=(HttpURLConnection)new URL(imageUrl).openConnection();
             //    icon=new Drawable(hc.getInputStream());
             //    hc.disconnect();
        }catch (Exception e) {
            // TODO: handle exception
            throw new RuntimeException(e);
        }
    }
}
时间: 2024-08-03 15:16:39

Android中图片的异步加载的相关文章

Android开发之图片处理专题(三):利用ThreadPoolExcutor线程池实现多图片的异步加载

在上一篇专题Android开发之图片处理专题(二):利用AsyncTask和回调接口实现图片的异步加载和压缩中我们实现了listView的图片的大量加载.今天,我们换一种方式,采用线程池的方式来实现. 我们需要准备两个东西: 1.图片下载任务类 2.线程池. 1.图片下载任务类. 图片下载任务类,将需要显示的iamgeView,线程通讯消息管理者handler进行了封装.当图片下载无论成功还是失败,handler发送对应的消息,传入的iamgeView显示对应的图片.这里就不在应用软引用技术,采

Android开发之图片处理专题(二):利用AsyncTask和回调接口实现图片的异步加载和压缩

在上一篇专题Android开发之图片处理专题(一):利用软引用构建图片高速缓存中我们讲述了如何利用软引用技术构建高速缓存.那么想要用到图片,首先得有图片的来源.一般而言,一个应用的图片资源都是从服务器处获得的.今天,我们利用Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载里面封装好的httpUtils来实现图片的下载,然后加载到本地配合软引用缓存使用,以一个listView为例子来说明. 一.准备工作 我们需要准备以下几个类(图片对象和软引用缓存类请参考上一篇专

android从网络上异步加载图像

研究了android从网络上异步加载图像: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Handler对象,加载图像方法如下所示 [java] view plaincopyprint? private void loadImage(final String url, final int id) { handler.post(new Runnable() { public void run()

Android引入高速缓存的异步加载全分辨率

Android引进高速缓存的异步加载全分辨率 为什么要缓存 通过图像缩放,我们这样做是对的异步加载优化的大图,但现在的App这不仅是一款高清大图.图.动不动就是图文混排.以图代文,假设这些图片都载入到内存中.必然会OOM.因此,在用户浏览完图像后.应当马上将这些废弃的图像回收,可是.这又带来了另一个问题.也就是当用户在浏览完一次图片后,假设还要返回去再进行又一次浏览,那么这些回收掉的图像又要又一次进行载入,保不准就要那些无聊到蛋疼的人在那一边看你回收GC.一边看你又一次载入.这两件事情,肯定是互

图片高效加载(二) 图片的异步加载

图片的异步加载是利用AsynTask类对图像进行后台加载完成后再给ImageView,先转载一篇前人的较好的总结后面再添加一些自己的见解和贴上完整的实现demo. 前面的转自:https://my.oschina.net/rengwuxian/blog/183802 摘要: 有没有过这种体验:你在Android手机上打开了一个带有含图片的ListView的页面,用手猛地一划,就见那ListView嘎嘎地卡,仿佛每一个新的Item都是顶着阻力蹦出来的一样?看完这篇文章,你将学会怎样避免这种情况的发

WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了,经过努力

Android中ViewPager+Fragment懒加载问题解决方案

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878 本文出自[DylanAndroid的博客] Android中ViewPager+Fragment懒加载问题解决方案 在Android中我们经常会用到ViewPager+Fragment组合.然而,有一个很让人头疼的问题就是,我们去加载数据的时候 由于ViewPager的内部机制所限制,所以它会默认至少预加载一个.这让人很郁闷,所以,我就想到要封装一个Fragme

Android下载图片 图片的异步加载 和缓存存取

一.创建异步任务 public class LoadBitmapAsyn extends AsyncTask<String,Void,Bitmap> { Context context; ImageView img; private HashMap<String,SoftReference<Bitmap>> imageCache=null; public LoadBitmapAsyn(ImageView img){ this.img=img; this.context=

实现图片的异步加载

图片异步加载功能是现在web中非常常见的一个针对web做优化的方法.尤其是在移动端,面对大量的图片列表的时候,如果没有做相应的优化,会直接导致页面滑动和加载的卡顿,而且用户会莫名的发现当前应用占用的流量会很大,因为他可能都没有浏览到很多图片,而程序就自动加载了所以的图片,对于一个流量吃紧的人来讲,这个也是很讨厌的.所以实现按浏览需求加载时十分有必要的. 其实实现图片异步加载的核心思路十分简单,就是通过判断当图片元素是否出现在视窗范围内后,则去加载图片资源,否则不加载.所以我们需要首先解决判断im