2010-06-11 51 views
7

我有一個非常小的活動,必須顯示圖像。Android setImageURI內存不足錯誤

如果圖片不是很小(例如1.12 Mb 2560x1920),它會在更改屏幕方向時產生內存不足。我試過getDrawable.setCallback(null),但沒有運氣。

我在哪裏錯了?

public class Fullscreen extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.gc(); 
    setContentView(R.layout.fullscreen); 
    ImageView imageView = (ImageView) findViewById(R.id.full_screen_image); 
    long imageId = 2; 
    imageView.setImageURI(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageId)); 
    } 
} 

回答

4

消耗更少的內存和下采樣/調整大小(請參閱BitmapOptions#inSampleSize的文檔)圖片。

+3

代碼示例HTTP ://stackoverflow.com/questions/477572/823966#823966 – Fedor 2010-06-11 07:42:24

11

嘗試添加到您的onDestroy方法:

ImageView imageView = (ImageView) findViewById(R.id.full_screen_image); 
BitmapDrawable bd = (BitmapDrawable)imageView.getDrawable(); 
bd.getBitmap().recycle(); 
imageView.setImageBitmap(null); 

這將回收您的ImageView內部使用的位圖。

+3

偉大的帖子,但你可以添加一個強制性的'if!= null'檢查bd :) – Ron 2013-05-27 14:43:36

+0

如果你總是在你的onCreate中設置drawable,那麼這是沒有必要的;) – gingo 2013-06-18 09:42:53

+0

回收似乎是一種非常古老的方法。 Android 4.0上有必要嗎? – Jacky 2015-01-21 12:59:03

1

您也可以使用這樣的事情:

 File picture = new File("path_to_image"); 
     if (picture.exists()) { 
      ImageView imageView = (ImageView)findViewById(R.id.imageView); 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inSampleSize = 2; 
      Bitmap myBitmap = BitmapFactory.decodeFile(picture.getAbsolutePath(), options); 
      imageView.setImageBitmap(myBitmap); 
     } 

閱讀下面的鏈接有關BitmapFactory選項(尤其是inSampleSize,控制二次採樣的程度)的更多信息:這裏http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html