1

나는 안드로이드 응용 프로그램에서 일하고 있습니다. 앱에는 각 항목에 표시 할 이미지가 포함 된 목록보기가 있습니다. 한 화면에 보통 약 3 개의 이미지가 포함될 수 있습니다. 저는 실제 카메라에서 압축되지 않은 이미지를 캡처하여 테스트 중이며 각각 1.5M 정도입니다. 두루마리가 정말로 느리고 꼼짝 못합니다. 안드로이드 OS 구현 때문에 이것이 궁금한가요? 아니면 잘못 사용 했나요?큰 이미지 목록보기가 매우 느립니다.

여기 세부의 : 목록보기에서

, 나는 그것이 findViewById하는 것보다 빠를 것이다 있도록 ViewHolder 모든 항목 인스턴스를 유지해야합니다. 이 listview의 활동로드시, 이미지 로딩에 도움이되는 두 개의 이미지 로더 AsyncTasks를 돌릴 것입니다. 내 이미지 로더는 싱글 톤으로 구현되며 2 단계 캐시를 사용합니다. 첫 번째 레벨 캐시는 SoftReferenceMap입니다 :

private Map<String, SoftReference<Bitmap>> l1ImageCache = 
     new HashMap<String, SoftReference<Bitmap>>(); 

와 L2 캐시는 캐시 폴더입니다. 캐시가 히트 할 수 없다면, 코드는 비동기 다운로드를 수행하고 뷰를 업데이트합니다. 전체 LoadImage 코드 경로는 AsyncTask 구현 및 UI 스레드 중 일부에 있습니다.

문제는 캐시가 정상적으로 작동하고 이미지로드가 매우 빠름 (메모리에서로드하는 데 약 10 밀리 초가 걸립니다)이지만 스크롤이 여전히 멈췄습니다.

12-15 21:56:46.622: I/Choreographer(5803): Skipped 62 frames! The application may be doing too much work on its main thread. 

이미지를 1M에서 각각 100K로 변경하면 이미지보기가 매우 부드럽게 변합니다.

이것이 OS 제한 사항인지 궁금합니다. 아니면 잘못된 것이있을 수 있습니까?

+3

asynctask를 사용하여 비트 맵로드 –

+0

범용 이미지 로더 https://github.com/nostra13/Android-Universal-Image-Loader – SathishKumar

+0

을 사용하여 이미지를 목록보기에 추가하기 전에 크기를 조정할 수 없습니까 ?? –

답변

1

이 경고는 코드가 많은 처리 시간/메모리를 필요로하므로 Android가 여러 계산 (프레임)을 말하는을 건너 뜁니다 (). 당신이하는 일은 구형 스마트 폰이 귀하의 코드를 실행하지 못하게 할 수 있습니다. 솔루션을 위해서는 Arju에서 이미 언급 한 AsynTasks를 사용하여 UI 스레드의 중요 부분을 이동해야합니다. 아주 좋은 소개는 here (Displaying Bitmaps Efficiently)입니다. 특히 현재 "압축되지 않은 실제 카메라 캡쳐 된 이미지"를 렌더링한다고 말하면서 Loading Large Bitmaps Efficiently 부분을주의 깊게 읽어야합니다. 거기에서 그러한 이미지의 실제 메모리 할당이 훨씬 크다는 것을 알게 될 것입니다. 마지막으로 성능 문제가 계속되는 경우 Making ListView Scrolling Smooth을 읽으십시오.

LazyList 또는 Android Universal Image Loader와 같은 타사 라이브러리를 사용하기 전에 이러한 문제에 익숙해 져야한다고 주장합니다.

+0

에 의해 디버깅하기가 어렵 기 때문에 반복적으로 조언 해 주셔서 감사합니다. 그러나 이미 AsyncTask를 사용했다고 언급 한 제 게시물을 참조하십시오. 나는 비트 맵을 10ms마다 "얻을"시간을 확인했다. 그리고 비동기이기 때문에 지연의 문제처럼 보이지 않는다. –

+1

죄송합니다. 내 실패. 그러나 AsyncTask를 Singleton으로 적용하는 이유는 무엇입니까? 병렬 처리 대신 이미지의 순차 로딩을 나타내지는 않습니까? 일반적으로 채우려는 ImageView에 대한 약한 참조를 유지하고 새로운 AsyncTask를 시작하기 전에이 ImageView에서 이미 작동중인 것이 있는지 확인합니다 ([Handle Concurrency] (http://developer.android.com/training/). displaying-bitmaps/process-bitmap.html # 동시성)). 이 작업이 ViewHolder에서도 작동하는지 잘 모르겠습니다. : / – Baschi