2013-01-09 3 views
11

나는 안드로이드 응용 프로그램에서 작업 중입니다. 목록보기가 포함 된 활동이 있습니다.목록보기 항목은 사용자가 스크롤 할 때 메모리에서 비트 맵을 제거합니다.

목록보기에는 항목이 많으며 각각 비트 맵 이미지가 포함되어 있습니다.

목록이 매우 크고 비트 맵을로드 할 때 일부 오래된 장치에서 많은 이미지를 포함하고 있기 때문에 메모리 오류가 발생합니다. 뷰에있는 항목에 대한 비트 맵 (또는 근처)

  • 로드
  • 때 사용자가 스크롤 I 다운 :

    은 그래서 기존의 장치에 대해 다음과 같은 작업을 수행 할 수있는 방법을 찾고 있어요 그에게 나타날 비트 맵을 로드하고 이제 숨겨진 비트 맵을 제거하십시오.
  • 언제든지보기에 있거나 그 근처에있는 이미지 만 힙에로드되고 다른 이미지는 더 이상보기에 없어지면 제거됩니다.

할 방법이 있습니까? 추가 정보

: 나는 (안드로이드 문서에 내가 찾을 수있는 사이트에) 효율적으로 비트 맵 이미지를로드하는 방법에 대한 모든 지침과 코드를 따랐다

, 나는 또한 확인했다은 전혀 기억이 없다 누수가 발생하면 모든 비트 맵을 재활용하고 GC가 올바르게 작동하는지 확인하고 마지막으로 오래된 장치에서 이미지의 해상도를 가능한 한 최소화했습니다. 그러나 목록의 크기로 인해 일부 장치에는 메모리 부족 현상이 계속 발생합니다.

위 제안 된 해결책을 수행 할 수 있는지 알고 싶습니다.

감사합니다 당신은 '게으른로드'에 대한 몇 가지 자습서 및 예제를 검색 싶어 도움

+0

뷰 홀더 패턴을 구현하려 했습니까? –

답변

11

.

Video from Google I/O about gallery app

소스 코드는 Google Code 볼 수 있습니다 그리고 그것은 갤러리 건물의 exclellent 예입니다. 또한 Romain Guy의 presentation (처음)에서 그가 성능 문제를 ListView으로 설명하고 어댑터를 효율적으로 사용하는 방법을 설명하는 것을 고려해야합니다. (ViewHolder 패턴 및 뷰 재사용).

다음은 GridView의 RecycleListener입니다 (API 레벨 1에서 사용 가능). RecyclerListener는 View가 RecycleBin의 스크랩 힙에 배치 될 때마다 알림을 수신하는 데 사용됩니다. 이 리스너는 RecycleBin에있는 뷰와 연관된 자원을 비울 때 사용됩니다. Universal Image Loader 같은 라이브러리를 사용하여

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

    mAdapter = new PhotoAdapter(this); 

    mGridView = (GridView) findViewById(android.R.id.list); 
    mGridView.setAdapter(mAdapter); 

    mGridView.setRecyclerListener(new RecyclerListener() { 
     @Override 
     public void onMovedToScrapHeap(View view) { 
      // Release strong reference when a view is recycled 
      final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); 
      imageView.setImageBitmap(null); 
     } 
    }); 

    // Kick off loader for Cursor with list of photos 
    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); 
} 
+0

대단히 감사합니다! – kaitian521

0

에 대한 많은.
한 가지 예는 다음과 같습니다 당신은 당신이 거기에 구현해야합니다 구글 I/O 2012 모두에서 샘플 갤러리 앱에서 찾고 고려해야한다 https://github.com/thest1/LazyList

+1

나는 이것에 착각 한 것일 수도 있지만 이미지가로드 될 때로드하는 게으른로드가 아니라 이미로드 된 이미지를 제거하지는 않습니다. – Youssef

+0

구현에 따라 다릅니다. 어쩌면 게으른 로딩은 기본적으로 당신이 그것을 설명하는 방법이지만, 나는 제공된 사실이 아니라는 사실을 안다. UI 패턴 앱에서 작동하는 다른 멋진 라이브러리의 모습을 볼 수 있습니다 (https://play.google.com/store/apps/details?id=com.groidify.uipatterns –

0

당신에게 이미지와 메모리 관리를 캐시에 대한 옵션을 제공합니다. 이를 통해 최대 캐시 크기를 설정할 수 있어야하며 또한 백그라운드 스레드에서 이미지로드를 처리해야합니다.

ListView는 이미지를 넣고 그 점에서 메모리에 더 쉽게 이동하는보기를 처리합니다.

+0

피카소와 같은 것도 효과가 있습니다. –

관련 문제