首先说一下,android系统加载大量图片系统内存溢出的3中解决方法:

(1)从网络或本地加载图片的时候,只加载缩略图。这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以图片失真比较严重,对于对图片质量要求很高的应用,可以采用下面的方法

/**

*按照图片路径加载

*@param path图片资源的存放路径

*@param scalSize缩小的倍数

*@return

*/

public static Bitmap loadResBitmap(String path, int scalSize){

BitmaoFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = false;

options.inSampleSize = scalSize;

Bitmap bmp = BitmapFactory.decodeFile(path, options);

reuturn bmp;

}

(2)运用JAVA的软引用,进行图片缓存,将经常需要加载的图片,存放在缓存里,避免反复加载。

(3)及时销毁不再使用的Bitmap对象。

if (bitmap != null && b!itmap.isRecycled()){

bitmap.recycle();

bitmap = null; // recycle()是个比较漫长的过程,设为null,然后在最后调用System.gc(),效果能好很多

System.gc();

}

好了,以上是主题之前的知识补充,以下是这篇blog的主要内容。HashMap> imageCache 关于SoftReference这个类多少知道些机制,只是处在会用的阶段(这是不够的)。

机制:简单来说,她会帮助我们管理内存,防止内存溢出,另外一点也就相当于map,临时缓存些图片drawable让我们可以直接引用,很好了解决了OOM异常.

实现代码片段:

[java]

package com.Tianyou.Mobile.Common;

import java.io.IOException;

import java.io.InputStream;

import java.lang.ref.SoftReference;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.HashMap;

import com.Tianyou.Mobile.Util.MyUtil;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.os.Handler;

import android.os.Message;

/***

* 异步加载图片 缓存的实现

*

* @author jia

*

*/

public class AsyncImageLoader {

// 软引用

private HashMap> imageCache;

public AsyncImageLoader() {

imageCache = new HashMap>();

}

/***

* 下载图片

*

* @param imageUrl

*            图片地址

* @param imageCallback

*            回调接口

* @return

*/

public Drawable loadDrawable(final String imageUrl,

final ImageCallback imageCallback) {

if (imageCache.containsKey(imageUrl)) {

SoftReference 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, imageUrl);

}

};

// 开启线程下载图片

new Thread() {

@Override

public void run() {

Drawable drawable = loadImageFromUrl(imageUrl);

// 将下载的图片保存至缓存中

imageCache.put(imageUrl, new SoftReference(drawable));

Message message = handler.obtainMessage(0, drawable);

handler.sendMessage(message);

}

}.start();

return null;

}

/***

* 根据URL下载图片(这里要进行判断,先去本地sd中查找,没有则根据URL下载,有则返回该drawable)

*

* @param url

* @return

*/

public static Drawable loadImageFromUrl(String imageURL) {

Bitmap bitmap = MyUtil.GetBitmap(imageURL, 100);

Drawable drawable = new BitmapDrawable(bitmap);

return drawable;

}

// 回调接口

public interface ImageCallback {

public void imageLoaded(Drawable imageDrawable, String imageUrl);

}

}

上面这个类斯通见惯了,大部分都是这样实现的,我现在要讲一点,也是迷惑我很久了一点(回调接口运用)本人基础不好,所以卡在这里了,

在listview中的getview方法中要调用这个方法:

代码片段:

[java]

public Drawable getDrawable(AsyncImageLoader asyncImageLoader,

String imageUrl, final ImageView imageView) {

Drawable drawable = asyncImageLoader.loadDrawable(imageUrl,

new ImageCallback() {

@Override

public void imageLoaded(Drawable imageDrawable,

String imageUrl) {

if (imageDrawable != null)

imageView.setImageDrawable(imageDrawable);

else

imageView.setImageResource(R.drawable.u6_normal);

}

});

return drawable;

}

这个方法作用:获取软用中的图片,其实在我们首次进入listview中的时候,软应用是不起作用的,只是用来下载图片保存至sd卡和软引用中.这个方法就是执行了这些操作,对于参数imageView 就是在要把获取的drawable设置进去.

执行的顺利:首先我们调用的是loadDrawable这个方法,然后查找软引用中有没有该drawable,没有的话则线程下载,下载ok后会执行

handleMessage中imageCallback.imageLoaded((Drawable) message.obj,

imageUrl);然后执行我们已经实现了这个接口.

在getiview 中执行代码片段:

[java]

Drawable drawable = getDrawable(asyncImageLoader, Image_L,

holder.iv_image);

if(drawable!=null)

holder.iv_image.setImageDrawable(drawable);

当我们下滑动后,然后在上滑动的时候软应用起到了效果,效率很快哦,可以和新浪聘美了,呵呵,玩笑,要优化的地方还很多.

android 图片加载 软引用_android Listview 软引用SoftReference异步加载图片相关推荐

  1. ajax右侧刷新加载jsp,jsp实现局部刷新页面、异步加载页面的方法

    jsp实现局部刷新页面.异步加载页面的方法 局部刷新页面.异步加载页面方案: 1.在jsp页面需要刷新的地方增加一个控件 2.新建一个jsp页面:aaa.jsp(用来放置需要刷新的内容) 3.将id为 ...

  2. 小程序 ajax 加载,小程序实战-小程序网络请求异步加载

    最初看到小程序的网络请求的时候,尤其是演示示例中,userInfoReadyCallback这个函数更是一头雾水.其实并不怎么理解.一直很费解.网上各路大侠都有解释,但是就是,不知道是怎么个顺序,而我 ...

  3. ajax实现向上正在加载,向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  4. android 软引用intent对象,Android中的软引用(SoftRefrerence)和弱引用(WeakReference)

    在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...

  5. Android异步加载

    为什么要异步加载: 为了用户体验,避免卡顿 Android系统要求使用异步加载,耗时操作会阻塞UI线程 异步加载的常用的方式: 多线程/线程池 AsyncTask 以下以加载网络图片为示例 在主类之外 ...

  6. 基于jQuery的图片异步加载和预加载实例

    如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...

  7. python 异步加载图片_Python 爬取拉钩网异步加载页面

    如下是我简单的获取拉钩网异步加载页面信息的过程 获取的是深圳 Python 岗位的所有信息,并保存在Mongo中 (对于异步加载,有的人说是把你要爬页面的信息整个页面先爬下来,保存本地,然后再看有没有 ...

  8. Android_异步加载1

    一.简介          我们知道,java中的线程是指异步,也就是在主程序进行的同时,副程序也在进行(比喻).Java中,实现异步一般使用2种方法,一种是实现接口Runable,一种是继Threa ...

  9. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...

    AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...

最新文章

  1. iOS 没到年底NSDate 时间出错问题
  2. ⑨③-不能浪费拥有的年轻资本
  3. GPT-3 不够 Open,BigScience 构建开放语言模型,规模小 16 倍
  4. 45. Jump Game II
  5. ASP.NET自定义控件组件开发 第一章 第二篇 接着待续
  6. python多线程坑_python多线程的坑
  7. Java9中的GC 调优
  8. 插入迭代器、流迭代器、反向迭代器、移动迭代器
  9. 商业大亨微信草花服务器,商业大亨2每日答题和服务器进度奖励
  10. 分级时间轮优化普通时间轮定时器(2):滴答式分层计时轮
  11. NW.js开发环境搭建
  12. NSIS安装包制做软件的常用小技巧
  13. HTML及相关知识汇总
  14. http://zjj2816.cnblogs.com/?Contact=1
  15. 9型人格人口占比数据_数据人格
  16. YTU OJ 2458: 换啤酒
  17. object标签属性详解
  18. 百度css3背景图代码,CSS3 实现花式背景图案
  19. 张博涵清华大学_清华大学人文学院
  20. Cron 表达式详解和案例

热门文章

  1. 数据源SqlDataSource,DetailView,ObjectDataSource控件的配置使用
  2. EMV技术学习和研究(五)脱机数据认证之DDA
  3. 报错ValueError: row index was 65536, not allowed by .xls format
  4. php fpm 开启status,启用php-fpm状态详解
  5. 四因素解读金银跌势仍将继续
  6. iPhone手机调试工具Safari
  7. python白名单验证是什么意思_luminati python+selenium使用方式(白名单和账号密码验证方式)...
  8. ENDNOTE使用方法
  9. OSI七层——物理层介绍和安全
  10. 阿里云中mysql数据库被攻击了,最终数据找回来了