Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:垃圾收集器不适用于位图_Android_Exception_Bitmap_Garbage - Fatal编程技术网

Android:垃圾收集器不适用于位图

Android:垃圾收集器不适用于位图,android,exception,bitmap,garbage,Android,Exception,Bitmap,Garbage,我有一个带有几个片段的ViewPager。在一个片段onCreateView中 我解码了分配给Fragment类中字段的两个位图。如果我尝试在片段之间滑动,在某个点,应用程序会得到一个OutOfMemory异常(堆已耗尽)。 好的,这是一个非常糟糕的做法,但是,GC不应该在我的应用程序被终止之前释放内存吗 将位图重新分配到同一字段会导致释放上一个位图,我错了吗?在S4上,我很快就得到了例外 除非另有说明,否则片段将保留在内存中,因此,您可以在刷卡时手动分离并处置片段,或者在刷卡时手动分离并处置m

我有一个带有几个片段的ViewPager。在一个片段onCreateView中

我解码了分配给Fragment类中字段的两个位图。如果我尝试在片段之间滑动,在某个点,应用程序会得到一个
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()释放本机内存。