- 浏览: 591611 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (154)
- java (31)
- Struts (3)
- Hibernate (8)
- Spring (6)
- JS (14)
- DWR (1)
- Oracle (1)
- SQL Server (0)
- JSF (0)
- JPA (0)
- Grails (3)
- Ajax (1)
- Extjs (0)
- jQuery (4)
- MySQL (2)
- 正则表达式 (2)
- 其他 (6)
- 计算机应用 (7)
- Groovy (8)
- Google (1)
- Web (2)
- MongoDB Java Driver (1)
- mongodb (1)
- Linux (3)
- HTML (1)
- Tomcat (3)
- Eclipse (2)
- JSP (1)
- 缓存 (1)
- 动态 (1)
- 问题与解决 (3)
- HY (1)
- Android (35)
- LBS (1)
最新评论
-
u012136165:
list 方法:纠正:[2,5].add(1,9) ...
Groovy的list和map -
bruce.yuan:
误人子弟的文章。已经看到N个人转了这个帖子,这要贻害多少新人啊 ...
理解并解决GBK转UTF-8奇数中文乱码 -
思念-悲伤:
特意登录上来,感谢下!
理解String的compareTo()方法返回值 -
bo_hai:
总结的好,有效。
理解String的compareTo()方法返回值 -
u012678420:
在onCreate方法中获取某个View的宽度和高度
在应用中经常需要下载很多的图片,因此,写好图片下载部分的代码非常关键。不好的代码很容易创建太多的对象,导致经常执行GC,接着就出现了ANR;也很容易导致内存溢出OOM。
现在,我从防止ANR和OOM的角度写下载图片的代码。再来分析一下需求,当我需要为图片列表下载很多张图片时,我期望图片是有顺序地一张一张显示,而不是开启很多线程同时下载多张图片(注意:这样也会影响每个线程的执行速度)。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; public class ImageDownloadThread extends Thread { //单例类 private ImageDownloadThread() {} private static ImageDownloadThread imageDownloadThread = null; public static ImageDownloadThread getInstance() { if (imageDownloadThread == null) { imageDownloadThread = new ImageDownloadThread(); imageDownloadThread.start();//创建后立刻运行 } return imageDownloadThread; } //缓存下载图片 private Map<String, String> cache = new HashMap<String, String>();//KEY:图片URL;VALUE:下载后的图片路径 public boolean isDownload(String imageUrl) { return cache.containsKey(imageUrl); } public Bitmap downloadWithCache(ImageDownloadItem item) { if (cache.containsKey(item.imageUrl)) { Bitmap bitmap = BitmapFactory.decodeFile(cache.get(item.imageUrl)); return bitmap; } else { addDownloadItem(item); } return null; } public void downloadWithoutCache(ImageDownloadItem item) { addDownloadItem(item); } //下载队列 private List<ImageDownloadItem> queue = new ArrayList<ImageDownloadItem>(); private synchronized void addDownloadItem(ImageDownloadItem item) { queue.add(item); this.notify();//添加了下载项就激活本线程 } @Override public void run() { while(true) { while(queue.size() > 0) { ImageDownloadItem item = queue.remove(0); String imagePath = downloadImage(item.imageUrl); //缓存图片路径 cache.put(item.imageUrl, imagePath); if (item.downloadListener != null) {//需要执行回调来显示图片 item.imagePath = imagePath; //交由UI线程处理 Message msg = handler.obtainMessage(); msg.obj = item; handler.sendMessage(msg); } } try { synchronized(this) { this.wait();//没有下载项时等待 } } catch (InterruptedException e) { e.printStackTrace(); } } } private String downloadImage(String imageUrl) { //TODO //不提供该方法代码 //下载部分应该有专门下载文件的类(如:FileDownloadUtil.download(imageUrl)) return ""; } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ImageDownloadItem item = (ImageDownloadItem)msg.obj; Bitmap bitmap = BitmapFactory.decodeFile(item.imagePath); item.downloadListener.update(bitmap, item.imageUrl); } }; public static class ImageDownloadItem { public String imageUrl;//需要下载的图片URL public String imagePath;//下载的后图片路径 private PostDownloadListener downloadListener;//回调监听 public void setPostDownloadListener(PostDownloadListener listener) { this.downloadListener = listener; } } public static interface PostDownloadListener { //策略模式,由子类实现 public void update(Bitmap bitmap, String imageUrl); } }
下面是使用的代码片段
public View getView(int position, View convertView, ViewGroup vg) { final ImageView imageView; if (convertView != null) { imageView = (ImageView)convertView; } else { imageView = new ImageView(this); } //在实际应用中imageUrl值是不同的 String imageUrl = "http://www.nxnet.net/yule/yljj/200710/W020071008388975463611.jpg"; imageView.setTag(imageUrl); //设置下载项 ImageDownloadItem item = new ImageDownloadItem(); item.imageUrl = imageUrl; //如果是无需显示图片的情况(如预下载),无需设置PostDownloadListener监听器 item.setPostDownloadListener(new PostDownloadListener() { @Override public void update(Bitmap bitmap, String imageUrl) { ImageView imageViewByTag = (ImageView)imageView.findViewWithTag(imageUrl); if (imageViewByTag != null) imageViewByTag.setImageBitmap(bitmap); } }); ImageDownloadThread imageDownloadThread = ImageDownloadThread.getInstance(); Bitmap bitmap = imageDownloadThread.downloadWithCache(item); if (bitmap != null) {//从缓存中取到 imageView.setImageBitmap(bitmap); } return imageView; }
发表评论
-
深入分析AIDL原理
2011-11-13 16:14 25361在上一篇文章(Service使用方式)中,介绍了Android ... -
Service使用方式
2011-11-13 15:23 6026使用Service的场合: ... -
在onCreate方法中获取某个View的宽度和高度
2011-10-08 14:54 14419有时候需要在onCreate方法中知道某个View组件的宽度和 ... -
不加载图片,仅仅获取图片文件分辨率
2011-10-08 11:09 3928当从SD卡中获取图片时,如果图片太大,加载会出现溢出异常。因此 ... -
图片移动和缩放
2011-09-29 22:15 2105import android.graphics.Matr ... -
定时任务
2011-09-28 00:53 1486定时任务有执行一次和重复执行两种 public cla ... -
几种创建LayoutInflater对象的方法
2011-09-28 00:51 1839LayoutInflater layoutInflate ... -
判断网络类型及是否有网络
2011-09-28 00:49 2740判断当前是否有可用网络 public boolean ... -
设置全屏
2011-09-26 23:40 18901.编程方式 public void setFullS ... -
dip与px单位之间转换
2011-09-25 10:11 1613//转换dip为px public static in ... -
屏幕尺寸(高、宽)
2011-09-25 10:11 1866Display display = getWindowM ... -
判断手机外存(SD卡)状态
2011-09-25 10:07 2137public int getExternalStorag ... -
SQLite数据类型
2011-09-25 10:03 9319一般数据采用的固 ... -
使用WebView实现腾讯微博OAuth登录
2011-09-24 21:11 4852接着上一篇文章"使用WebView实现新浪微博OAu ... -
使用WebView实现新浪微博OAuth登录
2011-09-20 12:18 8468#新浪官方下载SDK(weibo4android) h ... -
PopupWindow使用
2011-09-16 14:05 1766使用PopupWindow来显示一个浮层 点击按钮后弹出 ... -
Android通知
2011-09-07 17:56 1888private void showNotification() ... -
AlarmManager.RTC和ELAPSED_REALTIME的区别
2011-09-04 17:33 30033AlarmManager.RTC,硬件闹钟,不唤醒手机( ... -
开机自启动
2011-09-04 13:55 1620经常会有这样的需求,当手机开机后立刻启动一个服务或者一个活动。 ... -
Android虚拟机(DVM)内存分配——内存溢出问题
2011-09-03 17:19 9868大家都知道Android的上层应用是基于 Dalvik ...
相关推荐
安卓Android源码——防止内存溢出浅析.zip
android加载大图片的时候防止内存溢出的分析
异步下载图片,可用于listView 可以有效避免内存溢出
Android防止内存溢出浅析.zip
防止内存溢出浅析
内存溢出配置,内存溢出配置内存溢出配置内存溢出配置
android 图片下载 有效解决内存溢出问题 android 图片下载 有效解决内存溢出问题
分虽然多了点,但是项目...图片过大内存溢出:在图片读取是处理里图片,解决了溢出问题 项目下载后,直接导入就可以运行,是2.2的版本,有个插件android-async-http-1.4.4.jar,可能要配置下,还有服务器,端口是8080
Android防止内存溢出浅析
这个是源代码,源码的介绍请看: http://blog.csdn.net/i5suoi/article/details/19041399
Android 图片下载以及内存处理防止OOM内存溢出 源码
易语言防止文件内存溢出源码,防止文件内存溢出,读入子程序
使用BitmapFactory加载图片时,如果图片过大可能引起OutOfmemory溢出的问题。解决办法。
java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率
JAVA内存溢出问题总结
易语言源码易语言防止文件内存溢出源码.rar 易语言源码易语言防止文件内存溢出源码.rar 易语言源码易语言防止文件内存溢出源码.rar 易语言源码易语言防止文件内存溢出源码.rar 易语言源码易语言防止文件内存溢出...
android加载大量图片内存溢出的三种解决办法
软件开发 数据库 内存泄露 内存溢出