2016-12-20 16 views
1

DBからのイメージのリストをロードする際に問題が発生しました(OOM)。私のデータベースでは、画像はBLOBとして保存されます。これらのイメージは、RecyclerViewを使用してフラグメントにフェッチされ、表示されます。 画像はグライドを使用してロードされ、私は1つの列(画像添付)で3枚の画像を表示するGridLayoutManagerを使用している:Androidローディングバイト配列イメージのリスト

Glide 
.with(context) 
.load(image[]) 
.asBitmap() 
.override(dimensionPixelSize) 
.dontAnimate() 
.centerCrop() 
.placeholder(R.drawable.image) 
.into(imageView); 

GridLayout

画像がDBからフェッチされる場合、私はシングルトンに格納してい等

class ImageData { 
    private List<ImageModel> images; 

    private static final ImageDate instance = new ImageData(); 

    private ImageData() { 
    } 

    public static ImageData getInstance() { 
     return instance; 
    } 

    public void setImages(List<ImageModel> images) { 
     this.images = images; 
    } 

    public List<ImageModel> getImages() { 
     return images; 
    } 

} 

ImageModelクラスアダプタを作成する際の画像のリストを使用してクラス、その後、実際の画像と長いタイムスタンプフィールドに[]バイト有します。 また、フルスクリーンイメージonClickを表示する可能性があります。この場合、viewPagerでDialogFragmentを作成しており、ViewPagerAdapterはシングルトンクラスから同じリストを使用しています。 実際の問題は、ときどきOOMを取得できることです。これは15分後に起こります。アプリを使用したり、アプリを開いたり開いたりして何回か使用できます。 Glideにメモリとディスクキャッシュ戦略があることはわかっています。たとえば、.skipMemoryCache(true)またはdiskCacheStrategy(DiskCacheStrategy.SOURCE)を試しましたが、成功しませんでした。 いくつか提案してもらえますか?必要があれば、コードをいくつか追加できますが、基本的にRecyclerViewでViewHolderパターンを使用しています。このイメージを読み込むためのGlideコードはViewHolderクラスの内側にあります。

+0

'画像をDBから取り込んだときに、私はシングルトンクラスに保存しています.'これを行うべきではなく、必要に応じてDBから直接画像を読み込みます。 –

+0

さて、このようにして、シングルトンクラス – slena17

+0

の「実際の画像のためのバイト[]」を削除します。正確には? Jpg? PNG?あなたはBLOBとして正確に何を保存しますか? – greenapps

答えて

0

バイト配列は、デバイスで使用できるメモリによって制限されます。バイト配列を作成し、それを破棄しない場合、メモリが不足します。私はこれが役立つことを願っています

+0

バイト配列を作成するときは、DBからイメージをフェッチするときだけです。 'ImageModel image = new Image(cursor.getBlog(...));' – slena17

+0

@ slena17これについての更新は何ですか? –

+0

こんにちは、私は「仕事の間」などのために答えを投稿しませんでした。とにかく、OOMの問題は画像のリストではなく、viewPager内のフラグメントを破壊するコードを効率的に実装していなかったからです。私はviewPagerを持っていましたが、これは '重い' 5つのフラグメントで、常に変化する画面があり、OOMは1分以内に現れました。私はコードを掲示したいが、もはやリポジトリにアクセスすることはできない。 – slena17