在應用中常常須要下載不少的圖片,所以,寫好圖片下載部分的代碼很是關鍵。很差的代碼很容易建立太多的對象,致使常常執行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;
- }