2017-05-24 17 views
0

私はimageViewでアクティビティを持っています。デバイスを回転させると、onCreateはバックグラウンドスレッド内でビットマップの作成を開始します。いくつかの回転の後、ビットマップの作成にはOutOfMemoryErrorがあります。 これを修正する正しい方法は何ですか? weak referencesでの決定はありますか? ここに私のコードです:Android。回転時に観測可能なビットマップ作成時のOutOfMemoryエラー

public class ImageActivity extends AppcompatActivity implements View.OnTouchListener { 

    private ImageView imageView; 
    private Disposable imageDisp; 

    @Override 
    public void onDestroy() { 
     imageDisp.dispose(); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image); 
     imageView = (ImageView) findViewById(R.id.main_imageview); 

     String source = getIntent().getStringExtra("source"); 
     imageView.setImageBitmap(null); 
     imageView.setTag(source); 

     imageDisp = Observable.fromCallable(()->{ 
      File outputFile = new File(source); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
      Bitmap b = BitmapFactory.decodeFile(outputFile.getPath(), options); // here I have a outOfMemory 
      outputFile.delete(); 
      return b; 
     }).subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(bitmap -> { 
          imageView.setImageBitmap(bitmap); 
          imageView.setOnTouchListener(ImageActivity.this); 
       }, 
       throwable -> Toast.makeText(this, String.valueOf(throwable.getMessage()), Toast.LENGTH_SHORT).show()); 
    } 

} 
+0

ビットマップのサイズはどのくらいですか? Bitmap Options inSampleSizeで縮小する必要があるかもしれませんか? – Dimezis

+0

私の活動で大きなイメージが必要です。それは約5mpです。 – Rainmaker

答えて

-1

私はそれがどのように正しいか分からないが、これは動作します:

imageDisp = Observable.fromCallable(()->{ 
      System.gc(); 
      final WeakReference<Bitmap> bitmapReference = new WeakReference<Bitmap>(BitmapFactory.decodeFile(outputFile.getPath(), options)); 
      outputFile.delete(); 
      return bitmapReference; 
     }).subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(bitmap -> { 
          imageView.setImageBitmap(bitmap.get()); 
          imageView.setOnTouchListener(ImageActivity.this); 
       }, 
       throwable -> Toast.makeText(this, String.valueOf(throwable.getMessage()), Toast.LENGTH_SHORT).show()); 
+0

私はそれがどれほど正しいかを知っています。 1) 'System.gc()' - これはしばらくあなたのアプリケーション全体をフリーズします。あなたは決してそれを呼び出すべきではない。 2) 'WeakReference bitmapReference' - 近い将来に必要なオブジェクトを弱参照します(' subscribe() ')。いくつかのシナリオでは、 'bitmap.get()'の戻り値はnullかもしれません。 漏れはありません。基本的に大きすぎる写真をロードしています。 5MPXの写真(2560x1920)を表示する必要があるとお伝えしました。電話で2kのディスプレイでテストしますか?それ以外の場合は、大きな画像は必要ありません。 – skywall

+0

コメントありがとうございます。私は画像のサイズを小さくしようとします。 – Rainmaker

-3

変更この

Bitmap.Config.ARGB_8888;

Config.RGB_565

+0

この場合、ビットマップのメモリ使用量は少なくなりますが、エラーは引き続き発生する可能性があります。右? – Rainmaker

+0

それは問題の解決策ではありませんが、とにかくうまくいかない愚かな回避策です。 – Dimezis

関連する問題