웹에서 이미지를 다운로드받아
뷰페이저로 나열하고 있습니다.
오픈소스인 ImageDownloader 클래스를 사용하여 다운로드하는데요
이 소스에서는 다운로드가 완료되지 않으면 ImageView에 Drawable객체를 넣어주네요
비동기작업을 하는 AsyncTask에서는 Widget을 사용할 수 없게 되어있는 상태이고요..
다운로드시에 ProgressDialog를 띄우려면 어떻게 해야 하나요.
현재 구조는
-뷰가 보여지는 액티비티
ㄴ뷰페이저 어댑터 (이 어댑터 내에서 뷰를 생성하는 동시에 다운로드를 실행하도록 하였습니다)
-다운로드 클래스
다운로드 클래스를 액티비티내에 서브클래스로 넣는수밖에 없을까요.
지금 시도해보고자 하는 방법입니다.
액티비티내에 ProgressDialog 객체를 생성
다운로드클래스 내 AsyncTask에서
onPreExecute 시에 show
onPostExecute 시에 hide
하지만 다운로드클래스에서는 뷰액티비티의 Context를 모른다.
그러므로 ProgressDialog가 무엇인지 알 수 없다.
그럼 다운로드클래스에서 객체를 직접 제어하는 대신
뷰액티비티로 메세지를 날려 액티비티내에서 간접적으로 처리할 수 있도록 한다..... 어떻게?!
다 하셔놓구선......
ProgressDialog 객체 자체를 넘기면 되는겁니다~
ImageDownloader 생성자 안에서 받아서 쓰고
그걸 전역으로 선언해두면 되는거죠
chalsman 님이 하신 말씀이 정답이지만 우려했던 상황이 발생했네요.
이미지가 약 20장정도입니다. 그럼 뷰도 20개가 생성이되겠죠
이 20개의 뷰에대한 이미지의 URL을 통째로 넘깁니다. 그럼 일괄적으로 다운로드가 되겠죠
이러한 상황이 일어납니다.
1번뷰 다운로드중->로딩팝업 뜬다->다운로드완료->로딩팝업사라짐
2번뷰 다운로드가 완료되어있음->로딩팝업 뜬다(?)
제 생각엔 다른 뷰들의 다운로드작업까지 감지해서 이런현상이 일어나는듯하네요.
다른 뷰들의 다운로드작업과 상관없이
현재 활성화된 포커스에 대해서 따로 팝업을 띄울 수 없을까요??
자답입니다.
오늘 아침에서야 깨달은건데요.
뷰페이저 특성자체가 좀 특이하네요.
20개의 뷰를 생성한다고 가정했을시에
instantiateItem 메서드에서 작성한 뷰가 한번에 생성되는게 아니라
현재뷰와 양쪽뷰만 생성하는거였네요.
1번뷰가 보여지면 2번뷰를생성하고
2번뷰가 보여지변 1번뷰와 3번뷰가 생성된 상태로 있는거죠.
3번뷰가 보여지면 2번뷰가 생성된 상태이고, 1번뷰의 상태를 저장후 4번뷰에 그대로 재사용하는거....
그러니 다운로드가 일괄적으로 이루어지지않고, 포커스가 바뀔때마다 다운로드가 실행되는거죠
뭐 뷰의 재사용은 어댑터의 특성이지만 여기서 장애물이 될줄은 몰랐네요..
이래서 기본이 중요하다는걸 또한번 느끼네요.




핸들러요