我正在維護一個包含大量圖像的大應用程序。我使用它的主要問題是應用程序崩潰,因爲它會產生內存錯誤。我正在嘗試使用SoftReferences和WeakReferences,我已經閱讀過它,但我不知道是否必須在Android類(如GridView,BaseAdapter或ImageView)中使用它們。如何在Android應用程序中使用Soft/WeakReference類?
我的應用程序有一個地圖與標記頂部有一個畫廊的活動。當我點擊一個氣球時,第二個活動出現在一個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);
}
我的問題是,當我移動地圖,銷燬或暫停我做任何新的東西軟/ 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);
}
這就是我需要做的一切,或者在這種情況下我必須做任何其他軟參考?我有點困惑。
是的,我知道,但我保持這個程序,現在我沒有時間去改變它。那麼,當我應該使用軟弱引用來釋放以上信息的內存?而且,我是否需要在GridView,Adapters或ImageView中使用軟弱引用? – beni 2013-02-21 10:05:36