2011-01-04 6 views
0

그래서 SD 카드에서 Android Gallery로 이미지를로드하고 있습니다. 메뉴를 누른 다음 선택하고 갤러리 아래의 코드를 통해 삽입됩니다. 문제는 약 5 또는 6 이미지가 메모리 부족 오류가 발생했습니다. 01-04 18 : 10 : 35.246 : ERROR/AndroidRuntime (10220) : java.lang.OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다. 이 문제를 해결 하시겠습니까?Android Java Gallery 메모리 부족 오류

public class ImageAdapter extends BaseAdapter{ 

    int mGalleryItemBackground; 
    public ImageAdapter(Context c) {  
     mContext = c;  
     TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme); 
     mGalleryItemBackground = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0); 
     typArray.recycle(); 
    } 
    public int getCount(){ 
     return mUrls.length; 
    } 
    public Object getItem(int position){ 
     return position; 
    } 
    public long getItemId(int position) { 
     return position; 
    } 
    public View getView(int position, View convertView, ViewGroup parent){ 
     ImageView i = new ImageView(mContext); 

     i.setImageURI(mUrls[position]); 
     i.setScaleType(ImageView.ScaleType.FIT_XY); 
     i.setLayoutParams(new Gallery.LayoutParams(120, 120)); 
     return i; 
    }  
    private Context mContext; 
    }  
+0

재활용 방법을 제거해보십시오. 그것은 나를 위해이 문제를 해결했다. 그것은 최선의 관행인지는 모르겠다. – GSree

+0

나를 위해 작동하지 않았다 – Paul

답변

0

갤러리에 삽입하는 이미지의 너비와 높이는 얼마입니까? 크기가 너무 크거나 500x500 이상인 경우 갤러리에 추가하기 전에 크기를 작게 조정하고 크기가 120x120에 가까운 크기로 조정하는 것이 좋습니다.

Bitmap.createScaledBitmap 메서드를 사용하여 크기를 줄일 수 있습니다.

편집 : 이것은 ImageView에서 크기 조정을 수행하는 것과 다릅니다. ImageView는 표시되는대로 비트 맵의 ​​크기를 조정하지만 원래 비트 맵을 힙 메모리에 유지합니다. createScaledBitmap을 사용하고 원본 비트 맵을 버리면 많은 힙을 절약 할 수 있습니다.

+0

때마다 어떤 이유로 uri i.setImageURI (mUrls [위치])를 비트 맵으로 변환하려고 할 때 nullpointer 예외가 발생합니다. – Paul

+0

URL을 비트 맵으로 변환하려면 다음 중 하나를 수행하십시오. 또는 두 가지 게시물 모두 : http://stackoverflow.com/questions/3118691/android-make-an-image-at-a-url-equal-to-imageviews-image http://stackoverflow.com/questions/ 2471935/how-to-load-an-imageview-by-url-in-android – satur9nine

+0

내 애플 리케이션에서 다른 곳에서 해본 것처럼 이것을하는 법을 알고있다. 그러나 어떤 이유로 든 전화를하려고 할 때 그 오류가 발생한다. 위치 만약 내가 실제 정수를 사용하면 0 이상으로 작동하지만, 스케일링은 대답 인 것처럼 보일 것입니다. – Paul

0

시도 그것은 클래스의 private 멤버로 저장 컨텍스트/활동에 아주 나쁜 습관이다

private Context mContext; 

의 사용을 방지 할 수 있습니다. 문맥/활동은 매개 변수를 통해서만 사용하는 것이 좋습니다. Context를 저장하는 일반적인 결과는 메모리 누수입니다. 더 할 수 있습니다 read here.

+0

Hrm 이것은 Google sdk 예제에서 더 많거나 적은 것입니다. – Paul

+0

Noone은 완벽합니다 ... – barmaley

+0

실제로이 기사를 자세히 보면 "개인 컨텍스트 mContext"가 완벽하게 안전하다는 것을 알 수 있습니다. 이 기사에서는 정적 (static)이 Activity 객체의 수명주기를 초과하여 살아있어 누출이 발생하기 때문에 "정적"으로 인해 문제가 발생한다고 설명합니다. 이 전체 기사는 실제로 아키텍처 재앙의 약간을 나타내는 것 같습니다. 화면이 회전 할 때 Google이 활동을 재창조하는 이유는 무엇이며, 이는 최고의 디자인 IMHO가 아닙니다. – satur9nine