0

치수가 900 x 900 인 라지 이미지를 처리하고 있습니다. 이미지는 gridview 구현에 의해 표시됩니다. ViewPager 페이지에는 5 개의 gridview가 있습니다. 화면 방향을 4 번 변경하면 문제가 발생하여 메모리 오류가 발생하고 이미지가 표시되지 않습니다. 힙은 최대 43MB까지 증가합니다. 로그 고양이 오류를 게시했습니다. 유니버설 이미지 로더을 사용하고 있습니다.변경 사항이 5 번 변경된 후 메모리 사용 중

File cacheDir = new File(getActivity().getExternalCacheDir(), "CachedImages"); 
     if (!cacheDir.exists()) 
      cacheDir.mkdir(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
       getActivity()) 
       .threadPoolSize(5) 
       .threadPriority(Thread.MIN_PRIORITY + 3) 
       //.denyCacheImageMultipleSizesInMemory() 
       .discCacheFileNameGenerator(new HashCodeFileNameGenerator()) 
       .discCacheSize(3048576 * 20) 
       .memoryCache(new WeakMemoryCache()) 
       // 1MB=1048576 *declare 20 or more size if images are more than 
       // 200 

       .discCache(new UnlimitedDiscCache(cacheDir)) 
       // You can pass your own disc cache implementation 
       // .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
       .build(); 
     imageLoader.init(config); 

options = new DisplayImageOptions.Builder() 
     //.showStubImage(icon) 
     //Because you reuse view for different 
     //images you can see a previous image in the view while new image is loading. .resetViewBeforeLoading(true 
     .showImageForEmptyUri(R.drawable.content_picture) 
     .showImageOnFail(R.drawable.content_picture) 
     .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
     .bitmapConfig(Config.RGB_565) 
     .cacheInMemory(false) 
     .cacheOnDisc(true) 

     .resetViewBeforeLoading(true) 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .build(); 

로그 캣 :

10-22 18:19:25.856: E/SkWMTJdec(19464): wmt_jdec_header error : ERR_JDEC_NOT_SUPPORT_PROFILE! 
10-22 18:19:26.028: I/dalvikvm-heap(19464): Clamp target GC heap from 48.663MB to 48.000MB 
10-22 18:19:26.034: D/dalvikvm(19464): GC_FOR_ALLOC freed 692K, 3% free 47698K/49031K, paused 117ms, total 123ms 
10-22 18:19:26.034: I/dalvikvm-heap(19464): Forcing collection of SoftReferences for 1783372-byte allocation 
10-22 18:19:26.171: I/dalvikvm-heap(19464): Clamp target GC heap from 48.646MB to 48.000MB 
10-22 18:19:26.176: D/dalvikvm(19464): GC_BEFORE_OOM freed 16K, 3% free 47681K/49031K, paused 140ms, total 140ms 
10-22 18:19:26.176: E/dalvikvm-heap(19464): Out of memory on a 1783372-byte allocation. 
10-22 18:19:26.177: I/dalvikvm(19464): "pool-182-thread-1" prio=4 tid=13 RUNNABLE 
10-22 18:19:26.179: I/dalvikvm(19464): | group="main" sCount=0 dsCount=0 obj=0x41713660 self=0x5c8d92b0 
10-22 18:19:26.179: I/dalvikvm(19464): | sysTid=19664 nice=10 sched=3/0 cgrp=[fopen-error:2] handle=1551184560 
10-22 18:19:26.180: I/dalvikvm(19464): | schedstat=(0 0 0) utm=31 stm=2 core=0 
10-22 18:19:26.182: I/dalvikvm(19464): at android.graphics.Bitmap.nativeCreate(Native Method) 
10-22 18:19:26.183: I/dalvikvm(19464): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) 
10-22 18:19:26.189: I/dalvikvm(19464): at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
10-22 18:19:26.189: I/dalvikvm(19464): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.considerExactScaleAndOrientaiton(BaseImageDecoder.java:188) 
10-22 18:19:26.190: I/dalvikvm(19464): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:76) 
10-22 18:19:26.192: I/dalvikvm(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:305) 
10-22 18:19:26.193: I/dalvikvm(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:251) 
10-22 18:19:26.194: I/dalvikvm(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:129) 
10-22 18:19:26.195: I/dalvikvm(19464): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
10-22 18:19:26.195: I/dalvikvm(19464): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
10-22 18:19:26.195: I/dalvikvm(19464): at java.lang.Thread.run(Thread.java:856) 
10-22 18:19:26.197: I/View tag inside onLoadingComplete:(19464): image_item_grid_image 
10-22 18:19:26.204: E/ImageLoader(19464): null 
10-22 18:19:26.204: E/ImageLoader(19464): java.lang.OutOfMemoryError 
10-22 18:19:26.204: E/ImageLoader(19464): at android.graphics.Bitmap.nativeCreate(Native Method) 
10-22 18:19:26.204: E/ImageLoader(19464): at android.graphics.Bitmap.createBitmap(Bitmap.java:640) 
10-22 18:19:26.204: E/ImageLoader(19464): at android.graphics.Bitmap.createBitmap(Bitmap.java:586) 
10-22 18:19:26.204: E/ImageLoader(19464): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.considerExactScaleAndOrientaiton(BaseImageDecoder.java:188) 
10-22 18:19:26.204: E/ImageLoader(19464): at com.nostra13.universalimageloader.core.decode.BaseImageDecoder.decode(BaseImageDecoder.java:76) 
10-22 18:19:26.204: E/ImageLoader(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:305) 
10-22 18:19:26.204: E/ImageLoader(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:251) 
10-22 18:19:26.204: E/ImageLoader(19464): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:129) 
10-22 18:19:26.204: E/ImageLoader(19464): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
10-22 18:19:26.204: E/ImageLoader(19464): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
10-22 18:19:26.204: E/ImageLoader(19464): at java.lang.Thread.run(Thread.java:856) 

UPDATE :

@Override 
    public void onPause(){ 
     super.onPause(); 
     imageLoader.pause(); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     imageLoader.resume(); 
    } 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     imageLoader.stop(); 

    } 
+0

에 코드를 수정하십시오 비트 맵을 다시로드하지 말고 이것에 대해 살펴보십시오. http://developer.android.com/training/displaying-bitmaps/load-bitmap.html –

+0

@ A.S. 나는 언버사 이미지 로더 선생님을 사용하고 있습니다. – rahstame

+0

다음을 확인하십시오 : http : //stackoverflow.com/questions/14958543/view-pager-with-universal-image-loader-out-of-memory-error –

답변

2

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
     .showImageForEmptyUri(R.drawable.content_picture) 
     .showImageOnFail(R.drawable.content_picture) 

     .resetViewBeforeLoading(false) 
     .delayBeforeLoading(1000) 
     .cacheOnDisc(true) 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
     .build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()) 
     .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) 
     .threadPoolSize(5) 
     .defaultDisplayImageOptions(defaultOptions) 
     .denyCacheImageMultipleSizesInMemory() 
     .discCacheSize(50 * 1024 * 1024) 
     .writeDebugLogs() 
     .build(); 


     ImageLoader.getInstance().init(config); 

     ImageLoader.getInstance().handleSlowNetwork(true); 
+0

'@Override public Parcelable saveState() {return null; }'이것에 대해 뭐라 할 수 있니? 'FragmentStatePagerAdapter'와 함께 – rahstame

+0

답을 시도해보십시오. –

+0

이전에 이것을 사용해 보았지만 내 UI가 파괴되었습니다. 방향이 바뀌면 탭 탐색이 드롭 다운 목록으로 바뀝니다. 보기는 점점 작아지고 있습니다. 나는'FragmentStatePagerAdapter'와'Parcelable saveState()'를 사용하여 오리엔테이션 후에 프래그먼트 상태를 유지하려고합니다. – rahstame

0

모든 비트 맵을 재활용해야하는 것처럼 보입니다. 이 System.gc()와 같이 가비지 수집기를 호출 할 수도 있습니다.

앱의 방향이 바뀔 때마다 모든 비트 맵이 다시로드됩니다.

오리엔테이션 변경 후 호출되는 onResume()에서 메모리를 비울 수 있습니다.

public void onResume(){ 
    super.onResume(); 
    //Clean data 
} 
+0

OOM을 계속 받고있는'System.gc(); '을 추가하려고했습니다. – rahstame

0

사용 다음 함수이므로 못해 메모리 예외 밖으로 상승 결과 비트 맵을 사용하여,, 화상을 축소하는

공용 비트 맵 scaleDownBitmap (비트 맵 사진 newHeight를 INT, 컨텍스트 컨텍스트) {

당신이 일을 계속 시도 해 봤나
 final float densityMultiplier = context.getResources() 
       .getDisplayMetrics().density; 

     int h = (int) (newHeight * densityMultiplier); 
     int w = (int) (h * photo.getWidth()/((double) photo.getHeight())); 

     photo = Bitmap.createScaledBitmap(photo, w, h, true); 

     return photo; 
    } 
+0

이미지를 축소 할 수 없습니다. 의도적으로 확대를 위해 큰 이미지를 사용합니다. 감사합니다. – rahstame

관련 문제