android 图片加载 软引用_android Listview 软引用SoftReference异步加载图片
首先说一下,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异步加载图片相关推荐
- ajax右侧刷新加载jsp,jsp实现局部刷新页面、异步加载页面的方法
jsp实现局部刷新页面.异步加载页面的方法 局部刷新页面.异步加载页面方案: 1.在jsp页面需要刷新的地方增加一个控件 2.新建一个jsp页面:aaa.jsp(用来放置需要刷新的内容) 3.将id为 ...
- 小程序 ajax 加载,小程序实战-小程序网络请求异步加载
最初看到小程序的网络请求的时候,尤其是演示示例中,userInfoReadyCallback这个函数更是一头雾水.其实并不怎么理解.一直很费解.网上各路大侠都有解释,但是就是,不知道是怎么个顺序,而我 ...
- ajax实现向上正在加载,向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)
/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...
- android 软引用intent对象,Android中的软引用(SoftRefrerence)和弱引用(WeakReference)
在Android开发中,基本上很少有用到软引用或弱引用,这两个东东若用的很好,对自己开发的代码质量的提高有很大的帮助.若用的不好,会坑了自己.所以,在还没有真正的去了解它们之前,还是慎用比较好. 下面 ...
- Android异步加载
为什么要异步加载: 为了用户体验,避免卡顿 Android系统要求使用异步加载,耗时操作会阻塞UI线程 异步加载的常用的方式: 多线程/线程池 AsyncTask 以下以加载网络图片为示例 在主类之外 ...
- 基于jQuery的图片异步加载和预加载实例
如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...
- python 异步加载图片_Python 爬取拉钩网异步加载页面
如下是我简单的获取拉钩网异步加载页面信息的过程 获取的是深圳 Python 岗位的所有信息,并保存在Mongo中 (对于异步加载,有的人说是把你要爬页面的信息整个页面先爬下来,保存本地,然后再看有没有 ...
- Android_异步加载1
一.简介 我们知道,java中的线程是指异步,也就是在主程序进行的同时,副程序也在进行(比喻).Java中,实现异步一般使用2种方法,一种是实现接口Runable,一种是继Threa ...
- combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...
最新文章
- iOS 没到年底NSDate 时间出错问题
- ⑨③-不能浪费拥有的年轻资本
- GPT-3 不够 Open,BigScience 构建开放语言模型,规模小 16 倍
- 45. Jump Game II
- ASP.NET自定义控件组件开发 第一章 第二篇 接着待续
- python多线程坑_python多线程的坑
- Java9中的GC 调优
- 插入迭代器、流迭代器、反向迭代器、移动迭代器
- 商业大亨微信草花服务器,商业大亨2每日答题和服务器进度奖励
- 分级时间轮优化普通时间轮定时器(2):滴答式分层计时轮
- NW.js开发环境搭建
- NSIS安装包制做软件的常用小技巧
- HTML及相关知识汇总
- http://zjj2816.cnblogs.com/?Contact=1
- 9型人格人口占比数据_数据人格
- YTU OJ 2458: 换啤酒
- object标签属性详解
- 百度css3背景图代码,CSS3 实现花式背景图案
- 张博涵清华大学_清华大学人文学院
- Cron 表达式详解和案例
热门文章
- 数据源SqlDataSource,DetailView,ObjectDataSource控件的配置使用
- EMV技术学习和研究(五)脱机数据认证之DDA
- 报错ValueError: row index was 65536, not allowed by .xls format
- php fpm 开启status,启用php-fpm状态详解
- 四因素解读金银跌势仍将继续
- iPhone手机调试工具Safari
- python白名单验证是什么意思_luminati python+selenium使用方式(白名单和账号密码验证方式)...
- ENDNOTE使用方法
- OSI七层——物理层介绍和安全
- 阿里云中mysql数据库被攻击了,最终数据找回来了