Android:垃圾收集器不适用于位图
我有一个带有几个片段的ViewPager。在一个片段onCreateView中 我解码了分配给Fragment类中字段的两个位图。如果我尝试在片段之间滑动,在某个点,应用程序会得到一个Android:垃圾收集器不适用于位图,android,exception,bitmap,garbage,Android,Exception,Bitmap,Garbage,我有一个带有几个片段的ViewPager。在一个片段onCreateView中 我解码了分配给Fragment类中字段的两个位图。如果我尝试在片段之间滑动,在某个点,应用程序会得到一个OutOfMemory异常(堆已耗尽)。 好的,这是一个非常糟糕的做法,但是,GC不应该在我的应用程序被终止之前释放内存吗 将位图重新分配到同一字段会导致释放上一个位图,我错了吗?在S4上,我很快就得到了例外 除非另有说明,否则片段将保留在内存中,因此,您可以在刷卡时手动分离并处置片段,或者在刷卡时手动分离并处置m
OutOfMemory
异常(堆已耗尽)。
好的,这是一个非常糟糕的做法,但是,GC
不应该在我的应用程序被终止之前释放内存吗
将位图重新分配到同一字段会导致释放上一个位图,我错了吗?在S4上,我很快就得到了例外 除非另有说明,否则片段将保留在内存中,因此,您可以在刷卡时手动分离并处置片段,或者在刷卡时手动分离并处置mBitmap.recycle() 编辑,代码:
final FragmentTransaction fm = getActivity()
.getSupportFragmentManager().beginTransaction();
fm.replace(R.id.fragPlayerMain, playerFragment, "fragment").addToBackStack(null);
fm.hide(thisFrag);
fm.detach(thisFrag);
fm.commitAllowingStateLoss();
假设加载一个位图,假设这是第一个位图,然后为第一个位图分配一个新的解码后的第二个位图,当您解码第二个位图时,第一个位图不会被GC’ed。GC将在以后决定时执行此操作。如果要尽快释放内存,应该在解码第二个位图之前调用recycle()。Src:。再看看安卓的文章。也请参考。在抛出OutOfMemory之前运行GC不是更好吗?Android 2.3.3(API级别10)上的“为什么不这么做?”更低级别,位图的备份像素数据存储在本机内存中。它与存储在Dalvik堆中的位图本身是分开的。本机内存中的像素数据不会以可预测的方式释放,可能会导致应用程序短暂超出其内存限制并崩溃。“调用recycle()释放本机内存。