2016-11-22 15 views
2

イメージギャラリーアプリケーションを開発しようとしています。エラーは、上記のページで発生します。私のページが読み込まれると、ViewPager内のイメージビューと、私が使用した下部の水平ストリップが表示されますrecycler view.On loadOutOfMemory error on Glideを使ってビットマップを読み込んだViewpagerをスワイプし続ける

最初のイメージはViewPagerのイメージビューにロードされ、対応するイメージサムネイルは水平ストリップで強調表示されます。一番下の水平ストリップでサムネイルをクリックすると、対応する画像がViewpagerの画像ビューに読み込まれます。私のすべての機能は必要に応じて機能しています。しかし、私がアプリケーションのための大きなヒープを与えた後でさえ、ビューページャーを連続的にスワイプすると、アプリケーションは応答しなくなり/クラッシュします。ログとAndroid Monitorsのメモリグラフから、私は明らかにそのOOMエラーを確認することができました。 Glideを使用してビューポートの画像ビューに画像を読み込む際の重要な要素があります。ビューページャのdestroyItemメソッド内で、私も呼ばれている

Glide 
.diskCacheStrategy(DiskCacheStrategy.NONE) 
.skipMemoryCache(true) 

Glide.get(context).clearMemory(); 
     AsyncTask.execute(new Runnable() { 
     @Override 
     public void run() { 
      //TODO your background code 
      Glide.get(context).clearDiskCache(); 
     } 
    }); 

を:確かグライドはそれは私が次のメソッドを使用している使用してビットマップを解放作るために。

また、私がイメージビューにビットマップイメージをロードするために、次のグライドコードを使用しています

Glide 
.into(new SimpleTarget<Bitmap>() { 
@Override 
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
    mediaDetails.get(curPos).getFullImageView().setImageBitmap(resource); 
         } 
     } 

は、私がイメージビューにズームとパン機能を実装しているので、ビットマップリソースを必要としています。ビュー・ポケベル・ビューが破棄されたときに作成されたビットマップを解放する最も効果的な方法は何でしょうか。または、この問題を処理する他の方法がありますか?あなたの助けが最も価値があるでしょう。

+0

ビューページャにオフセット制限を設定していますか? – savepopulation

+0

@savepopulationそのデフォルト値、すなわち1に設定されています。私は限界を変更しようとしましたが、元に戻しました。 masoud valiの解決策は私にいくつかの休息を与えました。 Ramzのソリューションでさえ、クラスを追加する必要がある点を除いて同様です。 –

+0

はいソリューションは機能するはずです。私はちょうどあなたがこの状況を引き起こす可能性のある大きな数にオフセット制限を設定しているのだろうかと思った。 – savepopulation

答えて

1

ビットマップのサイズを変更するために使用overrideをロードしています

Glide 
.with(context) 
.load(url) 
.override(200, 200) 
.into(imageView); 
1

これは、ビットマップのサイズを変更してOutOfMemory例外を停止するのに役立ちます、以下のコードを試してみてください。

はグライドを使ってImageViewの中

private static final int MAX_WIDTH = 370; 
private static final int MAX_HEIGHT = 370; 

設定された画像は、別のライブラリに移動した場合

Glide.with(context_tab1).load(url).error(R.drawable.loader_bg).placeholder(R.drawable.loader_bg).transform(new BitmapTransform(MAX_WIDTH, MAX_HEIGHT)).into(holder.image); 

は、変換

public class BitmapTransform implements Transformation { 

    int maxWidth; 
    int maxHeight; 

    public BitmapTransform(int maxWidth, int maxHeight) { 
     this.maxWidth = maxWidth; 
     this.maxHeight = maxHeight; 
    } 

    @Override 
    public Bitmap transform(Bitmap source) { 
     int targetWidth, targetHeight; 
     double aspectRatio; 

     if (source.getWidth() > source.getHeight()) { 
      targetWidth = maxWidth; 
      aspectRatio = (double) source.getHeight()/(double) source.getWidth(); 
      targetHeight = (int) (targetWidth * aspectRatio); 
     } else { 
      targetHeight = maxHeight; 
      aspectRatio = (double) source.getWidth()/(double) source.getHeight(); 
      targetWidth = (int) (targetHeight * aspectRatio); 
     } 

     Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false); 
     if (result != source) { 
      source.recycle(); 
     } 
     return result; 
    } 

    @Override 
    public String key() { 
     return maxWidth + "x" + maxHeight; 
    } 

} 
0

をビットマップについては、以下のコードを追加し、変数をされて初期化します問題はありません、私はFrescoを使用するように勧める。フレスコプロジェクトのエンジニアの一人によると

画像はJavaヒープに保存されているが、ashmemヒープではありません。 中間バイトバッファもネイティブヒープに格納されます。この は、アプリケーションの使用可能なメモリが大幅に増えます。 OutOfMemoryErrorsのリスクが に減少します。また、ゴミの量を減らすために、より良いパフォーマンスを得るためには、コレクションのアプリケーションが行う必要があります 。

関連する問題