Android 试图避免堆增长(frag案例)

Android 试图避免堆增长(frag案例),android,android-viewpager,Android,Android Viewpager,我有一个pageOffscreenPageLimit设置为1的ViewPager(总共3页)。我使用它为每个页面显示4个位图。位图是异步加载、缩小的,所有这些都是为了避免OutOfMemory异常。我注意到一些由于GC而导致的页面滚动“暂停”,这里是一些日志: 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.8

我有一个pageOffscreenPageLimit设置为1的ViewPager(总共3页)。我使用它为每个页面显示4个位图。位图是异步加载、缩小的,所有这些都是为了避免OutOfMemory异常。我注意到一些由于GC而导致的页面滚动“暂停”,这里是一些日志:

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
03-22 13:05:06.320:V/test(11448):onPageSelected(2)
03-22 13:05:06.840:V/测试(11448):项目(0)
03-22 13:05:06.850:V/测试(11448):实例化项(3)
03-22 13:05:06.900:D/dalvikvm(11448):释放4578K的所有物质的GC,29%的释放15567K/21703K,暂停24毫秒
03-22 13:05:06.900:I/dalvikvm堆(11448):对于3128360字节分配,将堆(frag案例)增长到18.265MB

03-22 13:05:06.930:D/dalvikvm(11448):GC_FOR_ALLOC freed考虑到您使用的是Viewpager和ImageView,我想您有两个选择

关于图像视图尝试使用功能强大的Android图像下载和缓存库,如毕加索、最新的凌空图像加载(对大尺寸图像非常有用),以高效的方式提高图像加载能力

关于Viewpager您必须使用高效适配器FragmentStatePagerAdapter: 当有大量页面时,此版本的寻呼机更有用,工作方式更像列表视图。当页面对用户不可见时,其整个片段可能会被销毁,只保留该片段的保存状态。与FragmentPagerAdapter相比,这允许寻呼机保留与每个访问页面相关联的更少内存,但在页面之间切换时可能会产生更多开销

请在使用FragmentPagerAdapter之前考虑一下,因为它将整个片段存储在内存中,如果在ViewPager中使用大量片段,可能会增加内存开销。与之相反,FragmentStatePagerAdapter只存储片段的savedInstanceState,并在片段失去焦点时销毁所有片段。因此,当我们必须使用动态片段时,应该使用FragmentStatePagerAdapter,比如带有小部件的片段,因为它们的数据可以存储在savedInstanceState中。即使存在大量碎片,也不会影响性能。相反,当我们需要将整个片段存储在内存中时,应该使用它的兄弟片段PageRadapter。当我说整个片段保存在内存中时,这意味着它的实例不会被破坏,并且会产生内存开销。因此,建议仅在ViewPager的片段数较少时使用FragmentPagerAdapter。如果片段是静态的,那就更好了,因为它们不会有大量的对象来存储其实例。希望这能澄清Android FragmentPagerAdapter和FragmentStatePagerAdapter之间的区别

尝试学习android应用程序示例,使用图像视图加载动画来创造出色的用户体验

我希望这将解决您的成长堆问题


积分:

您正在缩小多少?您可以尝试将屏幕DPI与图像DPI匹配。如果你的屏幕很小,他们没有理由加载一个巨大的图像。我将图像缩小到实际大小,使用inSampleSize将最大功率放大2倍或等于所需大小,然后创建一个缩放位图。我关心的是增长堆(frag-case),正如您所看到的,有足够的空间分配新位图,但是“frag-case”增加了,我意识到这是因为内存碎片,我可以避免吗?