2010-07-05 5 views
5

게으름로드에 대한 게시물을 검토했지만 문제는 조금 다릅니다.Android : 게으른 로딩 중 갤러리

크기가 비교적 큰 20 개의 이미지 (각각 400-500K)를 표시하는 갤러리 (내 클래스 확장 갤러리)가 있습니다. OutOfMemory 예외가 발생하기 때문에 갤러리에 모두로드 할 수 없습니다.
그래서 20 개의 Drawables 배열을 만들고 처음 9 개의 요소 (이미지는 웹에서 가져온 것임)를 채우고 나머지는 모두 null로 설정합니다. 제 의도는 이것이었습니다 : 오른쪽 던지기에서 요소 번호 가져 오기. 10이고 null 요소 번호로 설정됩니다. 0. 오른쪽 fetch element no에 다른 fling에서 no. 11로 설정하고 null 요소 번호로 설정합니다. 1에서 null로. 남은 플링에서 같은 논리.

문제는 내가 요소를 가져 오는 것보다 훨씬 빨리 뛰어 올릴 수 있다는 것입니다.)

 
public View getView(int position, View convertView, ViewGroup parent){ 
    ImageView imageView = new ImageView(); 
    imageView.setDrawable(imageArray[position]; 
    .... 
    .... 

    return imageView; 
} 

가 어떻게의 getView를 (말할까요 - imageArray [위치] 여전히 null의 경우, "로드 ..."대화와를 보여 내 갤러리 BaseAdapter을 가지고 있으며, 그의 getView()이 같이 보입니다 같은 위치에 반복되면 스스로 설정 되니?
imageView가 비어있는 것을보고 싶지 않고 비공개로 설정하고 싶습니다. 나는 그것이 설정 될 때까지 imageView를 전혀 볼 수 없길 원합니다.

감사합니다.

+1

질문에 대한 답변을 제공하는 Android 블로그 (위의 예제 코드도 있음)에 대한 좋은 게시물이 있습니다. http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally

답변

6

갤러리는 원활한 사용 환경을 위해 설계되었습니다. 화면을 차단하고 가져올 때까지 다음 이미지로 전환하지 않으면 매우 나쁜 UI가됩니다. 이렇게하면 사용자는 전혀 도망 갈 수 없습니다. 이미지가로드되는 동안 이미지 대신 로딩 표시기를 표시해야합니다.

나는 귀하의 시나리오가 다소 일반적이라고 생각합니다. 이미지를 다운로드하여 표시해야합니다. OutOfMemory를 얻으면 Strange out of memory issue while loading an image to a Bitmap object 이미지를 슈퍼 샘플링 할 수 있습니다.

여전히 OutOfMemory가있는 경우 메모리에서 비트 맵을 제거하고 SD에 캐시해야합니다. 따라서 사용자가 물러서서 다시 SD에서 이미지를로드 할 수있을 정도로 빠릅니다. 그리고 메모리 소비는 낮아질 것입니다. 당신이 제안하는대로 최근 10 개의 이미지를 메모리에 캐시하고 다른 이미지를 SD에 캐시 할 수 있습니다.

내 샘플 코드 Lazy load of images in ListView을 살펴볼 수 있습니다. 사실 그것은 ListView 어댑터이지만 사소한 수정으로 갤러리에 적용 할 수 있습니다. 나는 그것이 당신이 필요로하는 것을 정확하게 할 것이라고 생각합니다.

+0

감사 인사 . 시도 할 것입니다 ... – Rob

+0

"로드하는 동안 이미지 대신 로딩 표시기를 표시해야합니다." 어떻게해야합니까? 갤러리 앞의 ProgressDialog에로드 표시기를 배치하는 방법을 알고 있지만 이미지 대신 표시기를 삽입하는 방법은 무엇입니까? 이미지 뷰는 런타임시 생성됩니다. XML로 정의 된 경우 기본 소스를 할당 할 수 있지만 여기서는 그렇지 않습니다 ... 감사합니다. – Rob

+1

문제가되지 않습니다. ProgressControl은 ImageView 대신 런타임에 만들 수 있습니다. 또는 런타임에 ImageView를 만들고 실제 이미지를 다운로드하는 동안 일부 스텁 이미지를 표시 할 수 있습니다. 샘플 코드에 스텁 이미지를 표시합니다. – Fedor