下载大量图片内存溢出的解决方案(使用SoftReference<Drawable>)

使用SoftReference<Drawable>解决大量图片下载内存溢出的问题。


public DrawableManager() { 
    drawableMap = new HashMap<String, SoftReference<Drawable>>(); 
} 
 
public Drawable fetchDrawable(String urlString) { 
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString); 
    if (drawableRef != null) { 
        Drawable drawable = drawableRef.get(); 
        if (drawable != null) 
            return drawable; 
        
        drawableMap.remove(urlString); 
    } 
 
    if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "image url:" + urlString); 
    try { 
        InputStream is = fetch(urlString); 
        Drawable drawable = Drawable.createFromStream(is, "src"); 
        drawableRef = new SoftReference<Drawable>(drawable); 
        drawableMap.put(urlString, drawableRef); 
        if (Constants.LOGGING) Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", " 
                + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", " 
                + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth()); 
        return drawableRef.get(); 
    } catch (MalformedURLException e) { 
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); 
        return null; 
    } catch (IOException e) { 
        if (Constants.LOGGING) Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e); 
        return null; 
    } 
} 
 
public void fetchDrawableOnThread(final String urlString, final ImageView imageView) { 
    SoftReference<Drawable> drawableRef = drawableMap.get(urlString); 
    if (drawableRef != null) { 
        Drawable drawable = drawableRef.get(); 
        if (drawable != null) { 
            imageView.setImageDrawable(drawableRef.get()); 
            return; 
        } 
        // Reference has expired so remove the key from drawableMap 
        drawableMap.remove(urlString); 
    } 
 
    final Handler handler = new Handler() { 
        @Override 
        public void handleMessage(Message message) { 
            imageView.setImageDrawable((Drawable) message.obj); 
        } 
    }; 
 
    Thread thread = new Thread() { 
        @Override 
        public void run() { 
            //TODO : set imageView to a "pending" image 
            Drawable drawable = fetchDrawable(urlString); 
            Message message = handler.obtainMessage(1, drawable); 
            handler.sendMessage(message); 
        } 
    }; 
    thread.start(); 
} 

转自:  http://wang-peng1.iteye.com/blog/719116

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值