Java OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины - PullRequest
1 голос
/ 03 ноября 2011

У меня есть 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); 
    }


}

Проблема: Проблема в том, что когда я нажимаю кнопку,отображаются доступные изображения, я выбираю одно из них и оно загружается в ImageView, когда я повторяю эти шаги несколько раз, когда приложение выдает исключение: java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машиныпоглядел на него и обнаружил, что эта проблема из-за утечек памяти, но я не могу найти, что не так с моим кодом.Может ли кто-нибудь потратить свое драгоценное время, чтобы помочь мне?

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Если вы делаете серию setImageURIs, вы загружаете серию растровых изображений в представление.Если вы получаете java.lang.OutOfMemoryError: bitmap size exceeds VM budget exception, это означает, что imageView не перезаписывает предыдущее растровое изображение при загрузке нового.Таким образом, вам

  • необходимо либо побудить imageView перезапустить предыдущее растровое изображение - возможно, с помощью setImageView("")
  • , либо получить растровое изображение из URI и использовать вместо него setImageBitmap(android.graphics.Bitmap);тогда вы можете сделать setImageBitmap(null) и bitmap.recycle().
0 голосов
/ 04 ноября 2011

Хорошо, вызывая , работает 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 в этой ситуации?

...