在应用中常常须要下载不少的图片,所以,写好图片下载部分的代码很是关键。很差的代码很容易建立太多的对象,致使常常执行GC,接着就出现了ANR;也很容易致使内存溢出OOM。javascript
如今,我从防止ANR和OOM的角度写下载图片的代码。再来分析一下需求,当我须要为图片列表下载不少张图片时,我指望图片是有顺序地一张一张显示,而不是开启不少线程同时下载多张图片(注意:这样也会影响每一个线程的执行速度)。java
下面是使用的代码片断android
- 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;
- //若是是无需显示图片的状况(如预下载),无需设置item.callback,即让item.callback = null
- item.callback = new ImageDownloadCallback() {
- @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;
- }