代码之家  ›  专栏  ›  技术社区  ›  beni

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

  •  0
  • beni  · 技术社区  · 11 年前

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

    我的应用程序有一个带标记的地图“活动”,上面有一个Gallery。当我点击一个气球时,会出现第二个带有网格视图的活动。

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

    ShotButton快照按钮; 画廊; 列出图像; 私人图像查看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类中,或者系统为我释放此内存?

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

    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 回复  |  直到 11 年前
        1
  •  1
  •   dmnlk    11 年前

    您不应该再使用软/弱引用缓存了。

    自从Android 2.3以来,垃圾收集过程发生了变化,软弱引用缓存系统是无效的。

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

    如何使用LruCache?试试这个

    Caching Bitmaps