2012-01-31 2 views
1

나는 게으른 로딩을 사용하고 server.I에서 그리드 뷰에 이미지를로드하고 내 안드로이드 app.I에서 그리드보기가 있습니다. 여기에서 만든 모든 비트 맵을 재활용해야합니다. Bitmap.recycle()을 수행하는 방법은 어댑터 또는 그리드보기에서 수행해야합니다. 나는 추억에서 벗어나고 있습니다. 제발 도와주세요.Gridview 어댑터에서 비트 맵을 재활용하는 방법은 무엇입니까?

답변

6

당신은 몇 가지 코드 (최소한 어댑터)를 표시해야합니다. 메모리 오류가 발생하는 경우보기 재활용을 올바르게 구현하지 않았거나 메모리 누수가있는 것일 수 있습니다. 한 번에 너무 많은 큰 비트 맵을로드하는 것이 가능할 수도 있지만 뷰를로드 할 수 있으면 메모리 누수가 발생할 확률이 훨씬 높습니다.

아무도 몇 가지 코드를 보지 않고 메모리 누수를 추적 할 수있을 것 없습니다. Bitmap.recycle()은 해결책이 아니므로 나머지 코드가 괜찮 으면 가비지 컬렉터가 충분하게 작동합니다.

은 참조 : http://www.youtube.com/watch?v=_CruQY55HOk을 안드로이드와 찾는 메모리 누수 메모리를 관리하는 방법에 대한 좋은 이야기를 위해. 또한

시도

: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html보기와 같은 목록에 이미지를로드, 그렇지 않으면 제대로 비동기 적으로 다운로드하거나하는 방법의 예를 들어.

편집 : 또한 내가 쓴 이미지 로딩 라이브러리를 체크 아웃, 그래서 당신이 모든에 대해 걱정할 필요가 없습니다 : https://github.com/bumptech/glide

5

체크 아웃 Displaying Bitmaps Efficiently 안드로이드 교육 클래스를. 백그라운드 스레드와 메모리 및 디스크 캐시를 사용하여 GridView에서 비트 맵을 표시하는 데 대한 강의 인 Displaying Bitmaps in your UI이 있습니다.

첫째,이 같은 사용자 정의 이미지 뷰 작성해야합니다 :

public class ImageViewRecyclable extends ImageView 
{ 
    private Bitmap bitmap; 

    public ImageViewRecyclable(Context context) 
    { 
     super(context); 
    } 

    @Override 
    public void setImageBitmap(Bitmap bm) 
    { 
     super.setImageBitmap(bm); 
     if (bitmap != null) bitmap.recycle(); 
     this.bitmap = bm; 
    } 
} 

우리 ImageViewRecyclable 비트 맵에 대한 포인터를 유지하고 예전를 재활용 아주 잘 작동 정말 간단한 방법이 있습니다

2

새 것을 설정하기 전에.

둘째, 당신은 convertView가 null인지 아닌지 확인하기 위해 어댑터의 getView에서 확인해야합니다. 그것은 우리의 사용자 지정 ImageViewRecyclable에 캐스팅 null이 아니고 그것에 비트 맵을 설정하면. 이 방법은 새 비트 맵을 설정하기 전에 이전 비트 맵을 재활용합니다.

이 어댑터의의 getView 코드는 다음과 같습니다

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ImageViewRecyclable imageView = (convertView == null) ? new ImageViewRecyclable(ActivityMain.this) : (ImageViewRecyclable) convertView; 
    byte[] bytes = .... 
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    imageView.setImageBitmap(bitmap); 

    return imageView; 
} 

내가 천 개 100 × 100 이미지로이 코드를 테스트했다. 메모리 오류가있는 50 개의 이미지를 표시 한 후에 원본 ImageView가 실패했지만이 코드는 눈금이 끝날 때까지 제대로 작동합니다.

이 코드는 작은 오프라인 이미지에는 매우 효과적이지만 온라인 및 큰 이미지에는 캐싱과 다른 것들이 필요합니다. 이것은 유용 할 수 있지만 일부 변경 사항을 적용해야합니다.

관련 문제