0

膨大な数の画像を含む大きなアプリを維持しています。私の主な問題は、メモリエラーが発生するため、使用するとアプリがクラッシュすることです。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);
   }

この場合、私がする必要があるのはそれだけですか、それともソフト参照で何か他のことをしなければなりませんか?私は少し混乱しています。

4

1 に答える 1

1

もうソフト/ウィーク参照キャッシュを使用しないでください。

Android 2.3以降、ガベージコレクションプロセスが変更され、ソフト弱参照キャッシュシステムが無効になります。

今、あなたはLruCacheを使うべきです、これは良いです:)

LruCacheの使い方は?これを試して

ビットマップのキャッシュ

于 2013-02-21T09:49:07.673 に答える