每次都不从sd加载图像(使用WeakReference?)

时间:2014-05-07 15:51:56

标签: android bitmap weak-references

我有这个人名单,每个人都有一个头像。每个人都有一个默认的头像,之后你可以更改它(应用程序将调整大小和圆圈裁剪的图像保存到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(它是图像的缓存,对吗?),它会保留在内存中直到内存泄漏。我对吗?我该怎么办?

2 个答案:

答案 0 :(得分:1)

请勿使用WeakReference。请改用LruCache。 Android的垃圾收集器非常具有攻击性,垃圾收集器很快就会清除对内存密集型映像的弱引用。来自Google:

  

过去,流行的内存缓存实现是SoftReference   或WeakReference位图缓存,但不建议这样做。   从Android 2.3(API Level 9)开始,垃圾收集器更多   积极收集软/弱参考,使他们   相当无效。

有关使用LruCache的帮助,请参阅以下链接:Caching Bitmaps

另外,正如@Sainath建议的那样,请使用第三方图像加载库。在Android中处理图像加载时需要考虑很多因素,因此最好使用已考虑所有这些因素的库。

答案 1 :(得分:0)

从Android开发者网站上看,这很好看,但你应该使用第三方库;图像加载是非常昂贵的操作,这取决于许多因素

我在许多应用程序中使用过Picasso库,它在性能和内存消耗方面都非常出色。

您可以从http://square.github.io/picasso/

找到它