我有这个人名单,每个人都有一个头像。每个人都有一个默认的头像,之后你可以更改它(应用程序将调整大小和圆圈裁剪的图像保存到sd)。
这是我的方法:
<ImageView
android:id="@+id/photo_list_item"
android:layout_width="70dip"
android:layout_height="70dip"
android:layout_marginRight="16dip"
android:contentDescription="@string/avatar_descp"
android:src="@drawable/defavatar" >
</ImageView>
这是构成列表的项目的一部分。 defavatar
是我已经谈过的默认头像。然后:
String m = person.getAvatar();
if(!m.equals(""))
{
loadBitmap("file://"+m, avatar);
}
getAvatar()
获取数据库头像的路径。如果不是null:
public void loadBitmap(String resId, ImageView imageView)
{
BitmapWorkerTask task = new BitmapWorkerTask(imageView);
task.execute(resId);
}
class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap>
{
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView)
{
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(String... params)
{
return decodeSampledBitmapFromResource(getContext(), Uri.parse(params[0]), 320, 320);
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap)
{
if (imageViewReference != null && bitmap != null)
{
final ImageView imageView = imageViewReference.get();
if (imageView != null)
{
imageView.setImageBitmap(bitmap);
}
}
}
}
此代码主要来自官方Android Dev Guides。
我的问题是这样:每次图像被一次又一次地加载(而且我首先看到默认的头像,而后来又看到了新的头像,这不是很好)。
我猜我可以使用WeakReference(它是图像的缓存,对吗?),它会保留在内存中直到内存泄漏。我对吗?我该怎么办?
答案 0 :(得分:1)
请勿使用WeakReference
。请改用LruCache
。 Android的垃圾收集器非常具有攻击性,垃圾收集器很快就会清除对内存密集型映像的弱引用。来自Google:
过去,流行的内存缓存实现是SoftReference 或WeakReference位图缓存,但不建议这样做。 从Android 2.3(API Level 9)开始,垃圾收集器更多 积极收集软/弱参考,使他们 相当无效。
有关使用LruCache
的帮助,请参阅以下链接:Caching Bitmaps。
另外,正如@Sainath建议的那样,请使用第三方图像加载库。在Android中处理图像加载时需要考虑很多因素,因此最好使用已考虑所有这些因素的库。
答案 1 :(得分:0)
从Android开发者网站上看,这很好看,但你应该使用第三方库;图像加载是非常昂贵的操作,这取决于许多因素
我在许多应用程序中使用过Picasso库,它在性能和内存消耗方面都非常出色。
找到它