java OutOfMemoryError:位图大小超过VM预算

时间:2011-11-03 18:42:25

标签: java android memory-leaks bitmap out-of-memory

我有ImageView&我的ImageActivity上有一个按钮。单击该按钮时,将列出可用图像,当单击其中一个图像时,它将加载到ImageView中。

imageView xml:

   <ImageView
        android:id="@+id/imageView"
        android:layout_width="300dip"
        android:layout_height="300dip"
        android:src="@android:drawable/alert_light_frame" 
   />

请参阅代码:

public class ImageActivity extends Activity {

    private static final int SELECT_PICTURE = 1; 
    private String selectedImagePath;
    private ImageView imageView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.comments_detail);

    imageView = (ImageView) findViewById(R.id.imageView);

      ((Button) findViewById(R.id.BtnBrowse))
       .setOnClickListener(new OnClickListener() 
       { 
          public void onClick(View arg0) 
          { 
              Intent intent = new Intent(); 
              intent.setType("image/*"); 
              intent.setAction(Intent.ACTION_GET_CONTENT); 
              startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
         }
       });
}

    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
        if (resultCode == RESULT_OK) 
        {
             if (requestCode == SELECT_PICTURE) 
             { 
                Uri selectedImageUri = data.getData(); 
                selectedImagePath = getPath(selectedImageUri); 
                //System.out.println("Image Path : " + selectedImagePath);
                imageView.setImageURI(selectedImageUri);  
           }  
       } 
    } 

    public String getPath(Uri uri) 
    {  
       String[] projection = { MediaStore.Images.Media.DATA }; 
        Cursor cursor = managedQuery(uri, projection, null, null, null); 
       int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
        cursor.moveToFirst();  
       return cursor.getString(column_index); 
    }


}

问题问题是当我点击按钮时会显示可用的图像,我选择其中一个&amp;它被加载到ImageView中,当我重复这些步骤时,应用程序抛出几次抛出异常: java.lang.OutOfMemoryError:位图大小超过VM预算

我瞪着它&amp;发现这个问题是因为内存泄漏但我无法找到我的代码有什么问题。任何人都可以花一些宝贵的时间来帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:1)

如果您执行了一系列setImageURIs,则会在视图中加载一系列位图。如果您收到java.lang.OutOfMemoryError: bitmap size exceeds VM budget exception,则表示imageView在您加载新位图时不会回收上一个位图。所以你

  • 要么鼓励imageView回收以前的位图 - 可能还有setImageView("")
  • 或从URI获取位图并改为使用setImageBitmap(android.graphics.Bitmap);然后你可以setImageBitmap(null)bitmap.recycle()

答案 1 :(得分:-1)

打电话 system.gc()有效!! 在将图像分配给imageView之前,我调用了System.gc()来处理内存和处理内存。有用。

查看修改后的代码:

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == RESULT_OK) 
    {
         if (requestCode == SELECT_PICTURE) 
         { 
            // calling GC to take care of memory, if you remove this one line of code
            // application will throw the error "VM out of memory error"
            System.gc();
            Uri selectedImageUri = data.getData(); 
            selectedImagePath = getPath(selectedImageUri); 
            imageView.setImageURI(selectedImageUri);  
       }  
   } 
} 

感谢@Torid

有人可以评论吗?这是在这种情况下调用GC的正确方法吗?