2013-10-22 20 views
0

我正在處理尺寸爲900 x 900的大圖。圖像通過gridview實現顯示。 ViewPager的頁面裏有5個gridviews。 4次屏幕方向改變後的問題,我出現內存錯誤,圖像開始不顯示。 堆增長到43 mb。我發佈了日誌貓錯誤。我正在使用通用圖像加載器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(); 

logcat的:

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

你試圖保持日e位圖,不重新加載它,也看看這個:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html –

+0

@ A.S。我正在使用unversal-image-loader先生。 – 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公共Parcelable saveState(){返回null; '',你能說這個嗎? 'FragmentStatePagerAdapter' – rahstame

+0

試試這個答案.. –

+0

我以前試過用它,但是它破壞了我的用戶界面,我正在使用標籤導航,在方向標籤更改爲下拉列表之後。意見越來越小。我正在使用'FragmentStatePagerAdapter'和'Parcelable saveState()'以在定位後保留片段狀態。 – rahstame

0

它看起來像你必須回收所有的位圖。你也可以像這樣調用垃圾收集器System.gc();

每當您的應用的方向發生變化時,它都會重新載入所有位圖。

您可以嘗試在方向更改後調用的onResume()中釋放內存。

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

我試着添加'System.gc();'仍然得到OOM。 – rahstame

0

使用下面的函數來按比例縮小圖片,,所以用結果位圖,它不會上漲超出內存異常

公共位圖scaleDownBitmap(位圖照片,詮釋newHeight, 上下文的背景下){

 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