2013-03-22 75 views
2

我有pageOffscreenPageLimit一個ViewPager設置爲1(在總共3個頁)。我用它來爲每個頁面顯示4個位圖。 Bitmaps異步加載,縮小和所有東西,以避免OutOfMemory異常。我注意到一些「攤位」滾動由於GC的頁面,在這裏一些片日誌:試圖避免成長堆(FRAG情況)

03-22 13:05:06.320: V/test(11448): onPageSelected(2) 
03-22 13:05:06.840: V/test(11448): destroyItem(0) 
03-22 13:05:06.850: V/test(11448): instantiateItem(3) 
03-22 13:05:06.900: D/dalvikvm(11448): GC_FOR_ALLOC freed 4578K, 29% free 15567K/21703K, paused 24ms 
03-22 13:05:06.900: I/dalvikvm-heap(11448): Grow heap (frag case) to 18.265MB for 3128360-byte allocation 
03-22 13:05:06.930: D/dalvikvm(11448): GC_FOR_ALLOC freed <1K, 15% free 18622K/21703K, paused 27ms 
03-22 13:05:06.990: D/dalvikvm(11448): GC_CONCURRENT freed 49K, 15% free 18636K/21703K, paused 1ms+4ms 
03-22 13:05:07.060: D/dalvikvm(11448): GC_FOR_ALLOC freed 3221K, 25% free 16298K/21703K, paused 21ms 
03-22 13:05:07.060: I/dalvikvm-heap(11448): Grow heap (frag case) to 18.979MB for 3128360-byte allocation 
03-22 13:05:07.100: D/dalvikvm(11448): GC_CONCURRENT freed <1K, 11% free 19353K/21703K, paused 1ms+3ms 
03-22 13:05:07.170: D/dalvikvm(11448): GC_FOR_ALLOC freed 3130K, 22% free 17026K/21703K, paused 20ms 
03-22 13:05:07.170: I/dalvikvm-heap(11448): Grow heap (frag case) to 19.694MB for 3131424-byte allocation 
03-22 13:05:07.210: D/dalvikvm(11448): GC_CONCURRENT freed <1K, 8% free 20084K/21703K, paused 1ms+3ms 
03-22 13:05:07.240: V/test(11448): onPageSelected(3) 
03-22 13:05:07.270: D/dalvikvm(11448): GC_FOR_ALLOC freed 42K, 8% free 20053K/21703K, paused 22ms 
03-22 13:05:07.270: I/dalvikvm-heap(11448): Grow heap (frag case) to 20.359MB for 729656-byte allocation 
03-22 13:05:07.290: D/dalvikvm(11448): GC_FOR_ALLOC freed <1K, 8% free 20765K/22471K, paused 20ms 
03-22 13:05:07.320: D/dalvikvm(11448): GC_FOR_ALLOC freed 3094K, 22% free 17739K/22471K, paused 19ms 
03-22 13:05:07.330: I/dalvikvm-heap(11448): Grow heap (frag case) to 20.386MB for 3128360-byte allocation 
03-22 13:05:07.350: D/dalvikvm(11448): GC_FOR_ALLOC freed <1K, 8% free 20793K/22471K, paused 20ms 
03-22 13:05:07.390: D/dalvikvm(11448): GC_CONCURRENT freed 2K, 8% free 20799K/22471K, paused 1ms+3ms 
03-22 13:05:07.490: D/dalvikvm(11448): GC_FOR_ALLOC freed 38K, 8% free 20772K/22471K, paused 27ms 
03-22 13:05:07.490: I/dalvikvm-heap(11448): Grow heap (frag case) to 21.061MB for 729656-byte allocation 
03-22 13:05:07.520: D/dalvikvm(11448): GC_FOR_ALLOC freed <1K, 8% free 21484K/23239K, paused 21ms 
03-22 13:05:07.760: V/test(11448): destroyItem(1) 
03-22 13:05:07.760: V/test(11448): instantiateItem(4) 
03-22 13:05:07.820: D/dalvikvm(11448): GC_FOR_ALLOC freed 6063K, 34% free 15558K/23239K, paused 24ms 
03-22 13:05:07.820: I/dalvikvm-heap(11448): Grow heap (frag case) to 18.526MB for 3411216-byte allocation 
03-22 13:05:07.850: D/dalvikvm(11448): GC_FOR_ALLOC freed 19K, 19% free 18869K/23239K, paused 19ms 
03-22 13:05:07.900: D/dalvikvm(11448): GC_CONCURRENT freed 6K, 19% free 18908K/23239K, paused 1ms+4ms 
03-22 13:05:07.960: D/dalvikvm(11448): GC_FOR_ALLOC freed 3463K, 30% free 16334K/23239K, paused 20ms 
03-22 13:05:07.960: I/dalvikvm-heap(11448): Grow heap (frag case) to 19.284MB for 3411216-byte allocation 
03-22 13:05:07.980: D/dalvikvm(11448): GC_FOR_ALLOC freed 0K, 16% free 19665K/23239K, paused 21ms 
03-22 13:05:08.030: D/dalvikvm(11448): GC_CONCURRENT freed 5K, 16% free 19674K/23239K, paused 1ms+3ms 
03-22 13:05:08.100: D/dalvikvm(11448): GC_FOR_ALLOC freed 3433K, 27% free 17033K/23239K, paused 22ms 
03-22 13:05:08.100: I/dalvikvm-heap(11448): Grow heap (frag case) to 19.966MB for 3411216-byte allocation 
03-22 13:05:08.140: D/dalvikvm(11448): GC_CONCURRENT freed <1K, 13% free 20363K/23239K, paused 2ms+3ms 
03-22 13:05:08.220: D/dalvikvm(11448): GC_FOR_ALLOC freed 3407K, 24% free 17749K/23239K, paused 19ms 
03-22 13:05:08.220: I/dalvikvm-heap(11448): Grow heap (frag case) to 20.666MB for 3411216-byte allocation 
03-22 13:05:08.260: D/dalvikvm(11448): GC_CONCURRENT freed 1K, 10% free 21079K/23239K, paused 1ms+4ms 

的堆大小保持在24MB,不成長。另外,在destroyItem中,我嘗試釋放ImageView,並將drawable和回調設置爲null。我可以改善表現嗎?或者這是一種正常行爲?

+0

你縮小了多少?您可以嘗試將屏幕DPI與圖像DPI進行匹配。如果你的屏幕很小,他們沒有理由加載一個巨大的圖像。 – minhaz 2013-03-28 02:27:03

+0

我將圖像縮小爲實際大小,inSampleSize爲最大功率2,大於或等於所需大小,然後創建縮放位圖。我關心的是增長堆(碎片情況),你可以看到有足夠的空間來分配新的位圖,但'碎片情況'引發了,我意識到這是因爲內存碎片,我可以避免這種情況嗎? – Ainun 2013-04-02 08:52:45

回答

1

我想你有兩個選擇考慮您正在使用Viewpager和Imageviews

關於圖像視圖嘗試使用功能強大的圖像下載和緩存庫爲Android一樣畢加索,最新的排球 Imageloading(對於大尺寸圖像真的很有幫助)以高效的方式提高圖像加載功能。

關於Viewpager你必須使用有效的適配器FragmentStatePagerAdapter: 這個版本的尋呼機的時候有大量的頁面,變得更像一個列表視圖是比較有用的。當頁面對用戶不可見時,它們的整個片段可能被破壞,只保留該片段的保存狀態。與FragmentPagerAdapter相比,這允許尋呼機保持與每個訪問頁面相關的更少的內存,代價是在頁面之間切換時潛在的更多開銷。

請想想你正在使用FragmentPagerAdapter之前becouse它在內存中存儲整個片段,並可能增加內存開銷,如果大量的碎片在ViewPager使用。與它的兄弟姐妹相反,FragmentStatePagerAdapter只存儲片段的savedInstanceState,並在失去焦點時銷燬所有片段。因此,當我們必須使用動態片段時(比如帶有小部件的片段),應該使用FragmentStatePagerAdapter,因爲它們的數據可以存儲在savedInstanceState中。即使有大量的碎片,它也不會影響性能。相反,當我們需要將整個片段存儲在內存中時,應該使用它的同胞FragmentPagerAdapter。當我說整個片段被保存在內存中時,它的意思是,它的實例不會被破壞,並會造成內存開銷。因此,建議僅在ViewPager的片段數量較少時才使用FragmentPagerAdapter。如果片段是靜態的,它會更好,因爲它們不會有大量的實例將被存儲的對象。希望這清除了Android FragmentPagerAdapter和FragmentStatePagerAdapter之間的區別。

嘗試學習Google android gallary應用示例,使用圖像視圖加載動畫以創造出色的用戶體驗。

我希望這將解決您的成長堆問題。

Credits:FragmentPagerAdapter vs FragmentStatePagerAdapter