2010-06-11 53 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