如何在Android应用程序中使用Soft / WeakReference类?

时间:2013-02-21 09:26:02

标签: android weak-references soft-references

我正在维护一个包含大量图像的大应用程序。我的主要问题是当我使用它时应用程序崩溃,因为它会产生内存错误。我正在尝试使用SoftReferences和WeakReferences,我已经读过它,但我不知道是否必须在GridView,BaseAdapter或ImageView等Android类中使用它们。

我的应用程序有一个带有标记的地图活动,顶部有一个图库。当我点击气球时,会出现带有gridview的第二个活动。

第一项活动,当我移动地图时,活动会重新加载图库中的所有标记和图像,并添加新的标记和图像。它具有以下属性:

ShotButton shotButton;     画廊画廊;     列出图像;     private ImageView mMyLocationImage;

Dialog spinnerDialog;

private GoogleMap map;

private HashMap<String, Marker> identified_marker = new HashMap<String, Marker>();
private HashMap<Marker, DavinciImage> identified_XXX_images = new HashMap<Marker, XXXImage>();

private GalleryAdapter gallery_adapter;

private AsyncTask<Poi, Void, Void> refresh_pois_async = null;

@Override
public void onCreate(Bundle savedInstanceState) {
       ----
       new SoftReference<List<Object>>(XXXImages);
       new WeakReference<HashMap<String, Marker>>(identified_marker);
   new WeakReference<HashMap<Marker, XXXImage>>(identified_XXX_images);
    }

我的问题是,当我移动地图,销毁或暂停活动时,我必须使用软/弱引用类来释放内存?我是否必须使用soft / weakreference类添加新的属性,例如GalleryAdapter必须添加到soft / weakReference类中,还是系统为我释放这个内存?

第二个活动有一个gridview,其中包含用户的所有图像。我在进入活动时加载所有数据,并在活动需要时加载图像。我在此活动中有以下内容。

ImageView                   mUserImage;
public String               myApplicationUserId;
public GridAdapter          imageAdapter    = null;
public GridView             gridview        = null;
public ImageLoader_Profile  mImageLoaderMedium;


---
gridview.setScrollingCacheEnabled(true);
gridview.setFriction(10);

---
new WeakReference<ImageLoader_Profile>(mImageLoaderMedium);

ImageLoader_Profile管理图像的负载。

public class ImageLoader_Profile{

   MemoryCache                     memoryCache = new MemoryCache( );
   private Map< ImageView, String> imageViews  = Collections.synchronizedMap( new WeakHashMap< ImageView, String>( ));

   public ImageLoader_Profile( Context context, Bitmap canvas, int deviceDensity) {

       ....        
       new SoftReference<MemoryCache>(memoryCache);
       new SoftReference<Map<ImageView,String>>(imageViews);
   }

在这种情况下,我需要做的还是我必须用软引用做任何其他事情?我有点困惑。

1 个答案:

答案 0 :(得分:1)

你不应再使用软/弱参考缓存了。

自Android 2.3以来,垃圾收集过程发生变化,软弱参考缓存系统无效。

现在,你应该使用LruCache,这很好:)

如何使用LruCache?试试这个

Caching Bitmaps