2012-11-02 2 views
2

유니버설 이미지 로더 1.6.2.jar (최신 버전)을 사용하고 있습니다. 이 라이브러리를 사용하여 이미지를 다운로드하고 캐시하려고합니다. 서버에서 다운로드 할 수있는 이미지가 47 개 있습니다. 총 5.22Mb입니다. 최대 크기는 720X480이고 크기는 143kb입니다. 오류가 발생한 후 40-41 개의 이미지가 잘 표시됩니다.유니버설 이미지 로더 : OutOfMemory 오류

11-02 16:30:12.150: E/ImageLoader(31033): null 
11-02 16:30:12.150: E/ImageLoader(31033): java.lang.OutOfMemoryError 
11-02 16:30:12.150: E/ImageLoader(31033): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
11-02 16:30:12.150: E/ImageLoader(31033): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493) 
11-02 16:30:12.150: E/ImageLoader(31033): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:83) 
11-02 16:30:12.150: E/ImageLoader(31033): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.saveImageOnDisc(LoadAndDisplayImageTask.java:218) 
11-02 16:30:12.150: E/ImageLoader(31033): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:138) 
11-02 16:30:12.150: E/ImageLoader(31033): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:72) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
11-02 16:30:12.150: E/ImageLoader(31033): at java.lang.Thread.run(Thread.java:856) 
11-02 16:30:47.170: E/Adreno200-ES20(31033): <qgl2DrvAPI_glUseProgram:1318>: **** 31033: glUseProgram(3) 
11-02 16:30:47.170: E/Adreno200-ES20(31033): <qgl2DrvAPI_glUseProgram:1318>: **** 31033: glUseProgram(6) 

git-hub에서 OOM에 대한 제안을보고 구현했습니다. 나는 아직도 그들을 따라 갔다 나는 잘못하고있다. 내 코드는

if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
     cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"neongall"); 
    else 
     cacheDir=context.getCacheDir(); 
    if(!cacheDir.exists()) 
     cacheDir.mkdirs(); 

    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
    .threadPoolSize(3) 
    .threadPriority(Thread.NORM_PRIORITY - 1) 
    .memoryCache(new WeakMemoryCache()) 
    .denyCacheImageMultipleSizesInMemory() 
    .offOutOfMemoryHandling() 
    .discCacheExtraOptions(720, 480, CompressFormat.JPEG, 75) 
    .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation 
    .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) 
    .imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000)) // connectTimeout (5 s), readTimeout (20 s) 
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
    .enableLogging() 
    .build(); 
    //Initialize ImageLoader with created configuration. Do it once on Application start. 
    imageLoader.init(config); 


    options = new DisplayImageOptions.Builder() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) 
    .displayer(new RoundedBitmapDisplayer(10)) 
    .build(); 

미리 감사드립니다. 모든 구성의

답변

15

첫째 :

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
.threadPoolSize(3) // equal to default value 
.threadPriority(Thread.NORM_PRIORITY - 1) // equal to default value 
.memoryCache(new WeakMemoryCache()) 
.denyCacheImageMultipleSizesInMemory() 
.offOutOfMemoryHandling() 
.discCacheExtraOptions(720, 480, CompressFormat.JPEG, 75) 
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation 
.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // equal to default value 
.imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000)) // connectTimeout (5 s), readTimeout (20 s) 
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // equal to default value 
.enableLogging() 
.build(); 

README의 구성을 복사하지 마십시오

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
.memoryCache(new WeakMemoryCache()) 
.denyCacheImageMultipleSizesInMemory() 
.offOutOfMemoryHandling() 
.discCacheExtraOptions(720, 480, CompressFormat.JPEG, 75) 
.discCache(new UnlimitedDiscCache(cacheDir)) 
.imageDownloader(new URLConnectionImageDownloader(120 * 1000, 120 * 1000)) 
.enableLogging() 
.build(); 

같다!

왜 OutOfMemory 처리를 중단 했습니까? 이 경우 OOM 오류는 ImageLoadingListener.onLoadingFailed(FailReason.OUT_OF_MEMORY)에서 직접 처리해야합니다. 당신을 위해

내 제안 : 구성

  • 에서

    • 삭제 .offOutOfMemoryHandling() 옵션 디스플레이 옵션에서 구성 .discCacheExtraOptions(720, 480, CompressFormat.JPEG, 75) 옵션
    • 사용 .imageScaleType(ImageScaleType.IN_SAMPLE_INT)을 삭제
    • 정말 RoundedBitmapDisplayer 필요합니까? 그것에 대한 문서를 참조하십시오, 그것은 반올림하는 동안 메모리에 추가 비트 맵을 만듭니다. 가능한 경우 사용하지 마십시오.