2013-12-10 1 views
1

Android Universal Image Loader 1.9.0을 사용하도록 업그레이드를 테스트하고 있습니다. 나는 안드로이드 4.2에서 이것을 테스트했다. 나는 백그라운드 서비스에서 이미지를 다운로드하고 캐싱하여 사용자를 방해하지 않는 백그라운드 스레드에서 실행되는 문제를 발견했습니다. 그러나 UIL은 주 스레드에서 이러한 이미지를로드하지 않는다고 불평하고 있습니다. 주 스레드에서 이러한 이미지를로드하고 싶지 않습니다. 사용자가 실제로 지정된 이미지를 볼 때 다운로드 할 필요가 없도록 백그라운드에서 디스크에 캐시 할 수 있기를 원합니다. ImageLoader.loadImage 이외의 백그라운드 스레드에 이미지를 미리 캐시하는 다른 방법이 있습니까? 그렇지 않은 경우, 메인 스레드가 아닌 스레드에서 디스크에 프리 캐싱을 허용하려면 어떻게합니까? 이 코드는 모두 IntentService에서 실행됩니다.Universal Image Loader를 사용하여 인 텐트 서비스 (백그라운드 스레드)에서 이미지를 캐시하는 방법

ImageLoaderConfiguration :

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
      getApplicationContext()) 
      .threadPriority(Thread.MAX_PRIORITY) 
      .memoryCacheSize(memoryCacheSize) 
      .denyCacheImageMultipleSizesInMemory() 
      .threadPoolSize(5) 
      .discCacheFileNameGenerator(new MyFileNameGenerator()) 
      .tasksProcessingOrder(QueueProcessingType.LIFO) 
      .build(); 

DisplayImageOptions :

DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc() 
       .imageScaleType(ImageScaleType.NONE).build(); 

로드 이미지 코드 :

imageLoader.loadImage(imageURI, options, 
      new SimpleImageLoadingListener() { 
       @Override 
       public void onLoadingComplete(String imageUri, View view, 
         Bitmap loadedImage) 
       { 
        loadNext(); // gives a notification update and loads next image URI in queue 
       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, 
         FailReason failReason) 
       { 
        loadNext(); // gives a notification update and loads next image URI in queue 
       } 
      }); 

답변

2

는 사실 UIL 이미지를 미리로드하는 방법을 제공하지 않는, 즉 단지 디스크 캐시에 추가 . 항상 디코딩 된 Bitmap을 반환합니다.

하지만 귀하의 경우에는 loadImageSync(...)을 사용할 수 있습니다. 나는 그것이 당신에게 더 적절하다고 생각합니다.

+0

이렇게 보이는 것은 주 스레드의 핸들러 검사도 무시합니다. 감사. –

+1

정확히 같은 일을 @ user1236327 달성하려고 노력하고 있지만 loadImageSync 캐시가 표시되지 않습니다. 어떻게 관리 했습니까? – yahya

+0

'loadImageSync (...) '에서 전달하는 옵션에서 캐싱을 활성화 했습니까? – NOSTRA

0

UIL의 코드로 다이빙 후, 나는 해결책을 알아 냈어. 그것이 최고의 사람인지는 모르겠지만 앞으로 누군가를 도울 수 있습니다. 당신이 DisplayImageOptions에 자신의 핸들러를 설정하면이 핸들러가 주 스레드에서 있는지 확인하는 검사를 건너 뜁니다 :

DisplayImageOptions options = new DisplayImageOptions.Builder().cacheOnDisc() 
      .imageScaleType(ImageScaleType.NONE) 
      .handler(new Handler()) // added this line 
      .build();