2013-04-01 2 views
0

ImageLoader.loadImage을 사용하여 여러 이미지를 다운로드하고 여러 스레드를 실행하려고합니다. 그들은 실행하는 데 시간이 걸리고 UI를 잠그고 싶지 않기 때문에 AsyncTask의 doInBackground() 함수에서 실행하고 싶습니다.doinbackground()에서 다른 스레드를 실행하는 법

그러나 doInBackground() 함수에서 새 스레드를 시작할 수 없습니다. 이 문제를 해결할 방법이 있습니까?

+0

왜 새 스레드를 시작할 수 없습니까? 오류가 있습니까? – Goddchen

+3

스레드 및 AsyncTask를 조금 읽으십시오.AsyncTask를 사용하여 UI를 잠그지 않으려 고합니다. Android 4.x에서는 UI 스레드에서 인터넷에 액세스하려고하면 실제로 요구 사항이며 앱이 다운됩니다. 여태까지는 그런대로 잘됐다. doInBackground는 이미 UI 스레드에서 실행되기 때문에 추가 스레드를 스핀 오프 할 이유가 없습니다. 동시에 여러 개의 스레드를 실행하여 여러 다운로드를 동시에 실행하려는 경우 AsyncTask가 필요하지 않습니다. – 323go

+0

@Jake 수정 된 답변을 확인하십시오. URL이 있으면 유니버설 이미지 로더를 사용하여 UI를 차단하지 않고도 listview 또는 gridview에 이미지를 표시 할 수 있습니다. – Raghunandan

답변

1

나는

AsyncTask를이 스레드와 핸들러 주위 헬퍼 클래스로 설계되었으며 일반적인 스레딩 프레임 워크를 구성하지 않습니다 323go에 의해 만들어진 의견에 동의. AsyncTasks는 짧은 작업 (최대 몇 초)에 이상적으로 사용해야합니다. 오랜 시간 동안 스레드를 실행해야하는 경우 java.util.concurrent pacakge에서 제공하는 다양한 API를 사용하는 것이 좋습니다 예 : Executor, ThreadPoolExecutor 및 FutureTask. (문서에서 직접 작성)

https://github.com/octo-online/robospice을 사용할 수 있습니다. 여러 가지 향신료 요청을 할 수 있습니다.

범용 이미지 로더

다운로드 및 이미지의 큰 숫자를 표시하려면, 목록보기 또는 그리드 뷰를 사용합니다. 이를 위해 Universal Image Loader 또는 Lazy list를 사용할 수 있습니다. 유니버설 이미지 로더는 샘플 원리를 지연 목록으로 사용합니다.

피카사 앨범 공용 폴더 (약 300 - 500)에서 이미지를 표시해야했습니다. http 요청을했고 응답은 json이었습니다. asynctask를 사용하여 http 요청을 게시하고 응답을 받으면 json을 파싱하여 URL을 가져옵니다. 일단 내가 URL을 가지고 유니버설 이미지 로더 이미지를로드하는 데 사용됩니다. 따라서 asynctask를 사용하여 단기 실행 작업을 수행 할 수 있습니다.

한 번에 3 개의 이미지를 목록으로 볼 수 있다고 가정합니다. 3 개의 이미지는 다운로드되어 캐시되지 않고 표시됩니다. 스크롤하면 절차가 반복됩니다. 캐시 된 이미지를 다시 다운로드 할 필요는 없습니다. 이 경우 UI는 차단되지 않습니다. 언제든지 아래로 스크롤 할 수 있습니다.

URL이 키로 간주됩니다. 이미지가 sdcard 또는 전화 메모리에 캐시됩니다. 캐시 위치를 지정할 수 있습니다. 이미지가 캐시에있는 경우. 다운로드하지 않고 캐시하고 표시하는 경우 캐시에서 이미지를 표시합니다.

두 가지 모두 캐싱을 사용합니다. Universal Image Loader에는 많은 구성 옵션이 있습니다. https://github.com/nostra13/Android-Universal-Image-Loader

링크의 기능을 확인하십시오. 당신은 당신의 필요에 따라 다른 옵션을 구성 할 수 있습니다

ImageView image=(ImageView)vi.findViewById(R.id.imageview); 
    imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options 

사용자 정의 어댑터 생성자 당신의 getView에서

File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder"); 

// Get singletone instance of ImageLoader 
imageLoader = ImageLoader.getInstance(); 
// Create configuration for ImageLoader (all options are optional) 
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a) 
     // You can pass your own memory cache implementation 
    .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation 
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) 
    .enableLogging() 
    .build(); 
    // Initialize ImageLoader with created configuration. Do it once. 
    imageLoader.init(config); 
    options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.stub_id)//display stub image 
    .cacheInMemory() 
    .cacheOnDisc() 
    .displayer(new RoundedBitmapDisplayer(20)) 
    .build(); 

()에서

.

부드럽게 스크롤하고 성능을 높이려면보기 소유자를 사용해야합니다. http://developer.android.com/training/improving-layouts/smooth-scrolling.html