膨大な数の画像を含む大きなアプリを維持しています。私の主な問題は、メモリエラーが発生するため、使用するとアプリがクラッシュすることです。SoftReferencesとWeakReferencesを使用しようとしています。これについては読みましたが、GridView、BaseAdapter、ImageViewなどのAndroidクラスで使用する必要があるかどうかわかりません。
私のアプリには、上部にギャラリーがあるマーカー付きのマップアクティビティがあります。バルーンをクリックすると、グリッドビューで2番目のアクティビティが表示されます。
最初のアクティビティでは、マップを移動すると、アクティビティはギャラリー内のすべてのマーカーと画像を再読み込みし、新しいマーカーと画像を追加します。次の属性があります。
ShotButton shotButton; ギャラリーギャラリー; 画像を一覧表示します。プライベートImageViewmMyLocationImage;
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クラスに追加する必要がありますか、システムがこのメモリを解放しますか?
2番目のアクティビティには、ユーザーのすべての画像を含むグリッドビューがあります。アクティビティに入るときにすべてのデータをロードし、アクティビティが必要なときに画像をロードします。このアクティビティには次のようなものがあります。
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);
}
この場合、私がする必要があるのはそれだけですか、それともソフト参照で何か他のことをしなければなりませんか?私は少し混乱しています。