2011-10-11 3 views
1

목록보기의 어댑터를 다시 설정하여 목록보기를 새로 고치는 메소드가 있습니다. 어댑터가 설정되면 각 목록 항목에 대한 축소판 이미지가 다운로드됩니다.Android : 비동기 적으로 별도의 스레드에서 메소드 실행

새 스레드에서 refreshListView()라는이 메서드를 실행하여 비동기 적으로 이미지를 다운로드 할 수 있지만 별도의 스레드에서 UI를 업데이트 할 수 없다는 것을 알고 있습니다.

대체 방법은 무엇입니까?

미리 감사드립니다.

답변

4

AsyncTask (http://developer.android.com/reference/android/os/AsyncTask.html) 또는 로더 (http://developer.android.com/guide/topics/fundamentals/loaders.html)를 사용할 수 있습니다. 나는 항상 더 쉬운 것처럼 보이는 로더를 사용하는 것이 좋습니다. 두 가지 모두 (이 중에서도) 특히 이런 유형의 문제에 맞게 설계되었습니다.

3.0 미만의 대상 플랫폼에서 로더를 사용하려면 http://developer.android.com/sdk/compatibility-library.html을 참조하십시오.

+0

로더는 3.0 이상 현재 사용 가능한 휴대 전화에서는 사용할 수 없습니다. –

+1

@PeterKnego 사실이 아닙니다. 안드로이드 호환성 패키지를 사용하면 누구나 쉽게 로더에 액세스 할 수 있습니다. http://developer.android.com/sdk/compatibility-library.html –

+0

Ahh, nice. 정보 주셔서 감사합니다. +1에 먼저 답하십시오. –

0

음을. 맞다면 이미지 다운로드가 끝나기 전에 새 어댑터를 사용하고 싶지 않을 것입니다. 어디 어댑터에서 이미지 다운로드 코드입니다. 그에 따라, 어댑터의보기가로드/표시되면 다운로드 코드에만 액세스 할 수 있습니다.

보통 이미지를 백그라운드 스레드에서 다운로드하고이를 (SoftReferences의) 콜렉션에 버퍼링합니다. 그런 다음로드 할 때 해당 컬렉션에서 어댑터를 읽습니다.

+0

기본적으로 어댑터는 다음과 같이 호출됩니다. "LazyAdapter lazyAdapter = new LazyAdapter (this, imagesListStringArray, listText1, listText2);" 따라서이 어댑터를 생성하고 설정하기 전에 채워진 문자열 배열을 사용하여 이미지가 어댑터로 전달됩니다. – EI756

+0

위의 LazyAdapter 생성자에서 imagesListStringArray는 문자열 배열입니까? 각 문자열은 다운로드 할 이미지의 URL입니까? – pumuckl

0

앞서 언급했듯이 다른 스레드에서 실행되는 AsyncTask를 사용할 수 있으며 별도의 스레드가 축소판을 다운로드하면 UI를 업데이트 할 수 있습니다. 구현 방법에 따라 AsyncTask의 onProgressUpdate() 메서드를 사용하여 다운로드 할 때 미리보기 이미지를 업데이트 할 수도 있습니다. 그렇지 않으면 onPostExecute를 사용하여 목록 어댑터를 다시 설정하십시오.

2

다음은 전체 코드입니다.

http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview/559781#559781

+0

manifest의 targetSDKVersion을 "2"로 설정하면 위 코드가 이미지를로드하는 것처럼 보입니다. 이것이 이미지를로드하는 가장 좋은 방법입니까? targetSDKversion을 2로 설정하지 않으면 자리 표시 자 이미지 만 표시되고 이미지는 다운로드되지 않은 것처럼 보입니다. – EI756

관련 문제