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

你的位圖的大小是多少?也許你應該縮小它與位圖選項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