过去一段时间一直有人和我说下载图片太多有时候会溢出内存 问我有啥办法,我说我也不知道除了把照片像素 参数缩小该一下,今天看源码的时候看见了SoftReference这个东西,我不知道干啥用的搜索了一下就是为了内存问题而应用的,而且好多地方用到了,我把他取出来弄了一下下载照片处理的方法,不过是handler处理的,如果用asn处理会更好一些吧
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();
}
下载图片过多溢出内存问题
最新推荐文章于 2021-05-29 00:27:30 发布