Android实现从缓存中读取图片与异步加载功能类

本文实例讲述了Android实现从缓存中读取图片与异步加载功能类。分享给大家供大家参考,具体如下:

在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现。

public class AsyncImageLoader {
  //SoftReference是软引用,是为了更好的为了系统回收变量
  private HashMap<String, SoftReference<Drawable>> imageCache;
  public AsyncImageLoader() {
    imageCache = new HashMap<String, SoftReference<Drawable>>();
  }
  public Drawable loadDrawable(final String imageUrl,final ImageView imageView, final ImageCallback imageCallback){
    if (imageCache.containsKey(imageUrl)) {
      //从缓存中获取
      SoftReference<Drawable> softReference = imageCache.get(imageUrl);
      Drawable drawable = softReference.get();
      if (drawable != null) {
        return drawable;
      }
    }
    final Handler handler = new Handler() {
      public void handleMessage(Message message) {
        imageCallback.imageLoaded((Drawable) message.obj, imageView,imageUrl);
      }
    };
    //建立新一个新的线程下载图片
    new Thread() {
      @Override
      public void run() {
        Drawable drawable = loadImageFromUrl(imageUrl);
        imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
        Message message = handler.obtainMessage(0, drawable);
        handler.sendMessage(message);
      }
    }.start();
    return null;
  }
  public static Drawable loadImageFromUrl(String url){
    URL m;
    InputStream i = null;
    try {
      m = new URL(url);
      i = (InputStream) m.getContent();
    } catch (MalformedURLException e1) {
      e1.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    Drawable d = Drawable.createFromStream(i, "src");
    return d;
  }
  //回调接口
  public interface ImageCallback {
    public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
  }
}

在Adapter中使用的方法为:

public class WeiBoAdapater extends BaseAdapter{
    private AsyncImageLoader asyncImageLoader;
    @Override
    public int getCount() {
      // TODO Auto-generated method stub
      return wbList.size();
    }
    @Override
    public Object getItem(int position) {
      // TODO Auto-generated method stub
      return wbList.get(position);
    }
    @Override
    public long getItemId(int position) {
      // TODO Auto-generated method stub
      return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      // TODO Auto-generated method stub
      convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.weibo, null);
      WeiBoHolder wh = new WeiBoHolder();
      wh.wbicon = (ImageView) convertView.findViewById(R.id.wbicon);
      wh.wbtext = (TextView) convertView.findViewById(R.id.wbtext);
      wh.wbtime = (TextView) convertView.findViewById(R.id.wbtime);
      wh.wbuser = (TextView) convertView.findViewById(R.id.wbuser);
      wh.wbimage=(ImageView) convertView.findViewById(R.id.wbimage);
      WeiBoInfo wb = wbList.get(position);
      if(wb != null)
      {
        convertView.setTag(wb.getId());
        wh.wbuser.setText(wb.getUserName());
        wh.wbtime.setText(wb.getTime());
        wh.wbtext.setText(wb.getText(), TextView.BufferType.SPANNABLE);
        Drawable cachedImage = asyncImageLoader.loadDrawable(wb.getUserIcon(), wh.wbicon, new ImageCallback(){
          public void imageLoaded(Drawable imageDrawable,ImageView imageView,String imageUrl){
            imageView.setImageDrawable(imageDrawable);
          }
        });
        if (cachedImage == null)
        {
          wh.wbicon.setImageResource(R.drawable.usericon);
        }else{
          wh.wbicon.setImageDrawable(cachedImage);
        }
      }
      return convertView;
    }
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android视图View技巧总结》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程之activity操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》及《Android资源操作技巧汇总》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android图片加载的缓存类

    本文为大家分享了Android图片加载的缓存类,供大家参考,具体内容如下 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferenc

  • android中写一个内部类来选择文件夹中指定的图片类型实例说明

    复制代码 代码如下: /**本类是用来选择文件夹中是.jpg类型的图片*/ private class JpgFileFilter implements FilenameFilter{ @Override public boolean accept(File dir, String filename) { // TODO Auto-generated method stub return filename.endsWith(".jpg"); } }

  • android图片类型之间相互转换实现代码

    本文实例讲述了android图片类型之间相互转换实现代码.分享给大家供大家参考.具体如下: android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下: 1.Drawable → Bitmap Java代码如下: public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawab

  • 非常实用的Android图片工具类

    本文实例为大家分享了Android图片工具类的具体代码,供大家参考,具体内容如下 import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.content.Context; import android.grap

  • Android中使用Bitmap类将矩形图片转为圆形的方法

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public static Bitmap makeRoundCorner(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); int left = 0, top = 0, right = width, bot

  • Android TextView显示Html类解析的网页和图片及自定义标签用法示例

    本文实例讲述了Android TextView显示Html类解析的网页和图片及自定义标签.分享给大家供大家参考,具体如下: Android系统显示HTML网页的最佳控件为WebView,有时候为了满足特定需求,需要在TextView中显示HTML网页.图片及解析自定义标签. 1.TextView显示Html类解析的网页 CharSequence richText = Html.fromHtml("<strong>萝卜白菜的博客</strong>--<a href='

  • Android中使用BitmapShader类来制作各种图片的圆角

    public   BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY) 调用这个类来产生一个画有一个位图的渲染器(Shader). bitmap:在渲染器内使用的位图 (1)tileX:The tiling mode for x to draw the bitmap in.   在位图上X方向花砖模式 (2)tileY:The tiling mode for y to draw the bitmap in.

  • Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag

  • Android在layout xml中使用ViewStub完成动态加载问题

    一.Layout XML文件常见的两种模块加载方式 1.静态加载:被加载的模块和其它模块加载的时间一样. <include layout="@layout/otherLayout"/> 2.动态加载:需要被加载的模块初始时并没有被加载进内存,在你需要加载这个模块才会被动态的加载进去. <ViewStub android:layout="@layout/otherLayout"/> 还要把layout width和height加上 二.View

  • 纯JS实现的批量图片预览加载功能

    1.实现原理直接见代码,需要一张转圈的小图片,需要预览的所有图片默认的位置全是这张小图片,滚轮滚到原图需要出现的位置时候,预览加载替换小图片.实现效果 复制代码 代码如下: <div style="height: 2500px;" id="txtScrollTop"> </div> <div id="galleryList"> </div> 复制代码 代码如下: var util = { $: fu

  • 在Android的应用中实现网络图片异步加载的方法

    前言 其实很幸运,入职一周之后就能跟着两个师兄做android开发,师兄都是大神,身为小白的我只能多多学习,多多努力.最近一段时间都忙的没机会总结,今天刚完成了android客户端图片异步加载的类,这里记录一下(ps:其实我这里都是参考网上开源实现) 原理 在ListView或者GridView中加载图片的原理基本都是一样的: 先从内存缓存中获取,取到则返回,取不到进行下一步     从文件缓存中获取,取到则返回并更新到内存缓存,取不到则进行进行下一步     从网络上下载图片,并更新内存缓存和

  • ListView异步加载图片实现思路

    在应用开发中,经常用到ListView去加载数据,加载图片和文字是比较常见的,文字还好,图片从网络请求加载速度比较慢,所以需要把图片的加载放到另一个线程中去执行,执行完了再更新UI线程.以下列出一个我在项目中使用到的异步加载图片的解决方案,代码没有上全,给出核心部分. 大致思路是这样: 1.利用软引用来缓存图片Bitmap,用图片的URL作为缓存查找的Key: 2.设两级缓存,一级是SoftReference,二级是本地SD卡: 3.如果两级缓存都没取到图片,则从服务器获取,并加入缓存: 4.加

  • ListView异步加载图片实现思路(优化篇)

    在APP应用中,listview的异步加载图片方式能够带来很好的用户体验,同时也是考量程序性能的一个重要指标.关于listview的异步加载,网上其实很多示例了,中心思想都差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏- 贴张效果图先: 异步加载图片基本思想: 1.先从内存缓存中获取图片显示(内存缓冲) 2.获取不到的话从SD卡里获取(SD卡缓冲) 3.都获取不到的话从网络下

  • Android中使用二级缓存、异步加载批量加载图片完整案例

    一.问题描述 Android应用中经常涉及从网络中加载大量图片,为提升加载速度和效率,减少网络流量都会采用二级缓存和异步加载机制,所谓二级缓存就是通过先从内存中获取.再从文件中获取,最后才会访问网络.内存缓存(一级)本质上是Map集合以key-value对的方式存储图片的url和Bitmap信息,由于内存缓存会造成堆内存泄露, 管理相对复杂一些,可采用第三方组件,对于有经验的可自己编写组件,而文件缓存比较简单通常自己封装一下即可.下面就通过案例看如何实现网络图片加载的优化. 二.案例介绍 案例新

  • Android实现图片缓存与异步加载

    ImageManager2这个类具有异步从网络下载图片,从sd读取本地图片,内存缓存,硬盘缓存,图片使用动画渐现等功能,已经将其应用在包含大量图片的应用中一年多,没有出现oom. Android程序常常会内存溢出,网上也有很多解决方案,如软引用,手动调用recycle等等.但经过我们实践发现这些方案,都没能起到很好的效果,我们的应用依然会出现很多oom,尤其我们的应用包含大量的图片.android3.0之后软引用基本已经失效,因为虚拟机只要碰到软引用就回收,所以带不来任何性能的提升. 我这里的解

  • 深入剖析Android的Volley库中的图片加载功能

    一.基本使用要点回顾 Volley框架在请求网络图片方面也做了很多工作,提供了好几种方法.本文介绍使用ImageLoader来进行网络图片的加载. ImageLoader的内部使用ImageRequest来实现,它的构造器可以传入一个ImageCache缓存形参,实现了图片缓存的功能,同时还可以过滤重复链接,避免重复发送请求. 下面是ImageLoader加载图片的实现方法: public void displayImg(View view){ ImageView imageView = (Im

  • android异步加载图片并缓存到本地实现方法

    在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public

随机推荐