我正在维护一个包含大量图像的大型应用程序。我的主要问题是应用程序在我使用它时崩溃,因为它会产生内存错误。我正在尝试使用 SoftReferences 和 WeakReferences,我已经阅读过,但我不知道是否必须在 GridView、BaseAdapter 或 ImageView 等 Android 类中使用它们。
我的应用程序有一个带有标记的地图活动,顶部有一个画廊。当我点击一个气球时,第二个活动会出现一个网格视图。
第一个活动,当我移动地图时,活动会重新加载图库中的所有标记和图像并添加新的标记和图像。它具有以下属性:
射击按钮 射击按钮;画廊画廊;列出图像;私有 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);
}
我的问题是当我移动地图、销毁或暂停活动时,我必须使用软/弱引用类做任何新的事情来释放内存?我是否必须添加带有软/弱引用类的新属性,例如必须将 GalleryAdapter 添加到软/弱引用类中,或者系统为我释放此内存?
第二个活动有一个包含用户所有图像的网格视图。我在进入活动时加载所有数据,并在活动需要时加载图像。我在这个活动中有以下内容。
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);
}
在这种情况下,这是我需要做的全部还是我必须对软引用做任何其他事情?我有点困惑。