Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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_Garbage Collection_Out Of Memory - Fatal编程技术网

如何确保Android位图从堆中清除

如何确保Android位图从堆中清除,android,garbage-collection,out-of-memory,Android,Garbage Collection,Out Of Memory,我有一个活动(activity1),它使用了大量的位图。我还有另一个加载位图的活动(activity2)。在某些手机上运行时,我在activity2中遇到OOM错误。我已经找到了由activity1中的布局引起的错误。如果我取出activity1中的所有位放大器,并用十六进制颜色替换它们,那么activity2中就不会出现OOM错误 因此,我假设在调用activity1的onPause或onDestroy方法时,我在activity1中使用的位图不会从堆中删除。到目前为止,我已经尝试了来自的答案

我有一个活动(activity1),它使用了大量的位图。我还有另一个加载位图的活动(activity2)。在某些手机上运行时,我在activity2中遇到OOM错误。我已经找到了由activity1中的布局引起的错误。如果我取出activity1中的所有位放大器,并用十六进制颜色替换它们,那么activity2中就不会出现OOM错误

因此,我假设在调用activity1的onPause或onDestroy方法时,我在activity1中使用的位图不会从堆中删除。到目前为止,我已经尝试了来自的答案,但我仍然得到我的错误。到目前为止,这里是我的onPause和onResume方法

@Override
protected void onPause() {
    mCache.onPause();
    mContext = null;

    mTimer.cancel();
    mTimer = null;

    unbindDrawables(findViewById(R.id.home_root));
    System.gc();

    super.onPause();
}

private void unbindDrawables(View view) {
    if (view.getBackground() != null) {
    view.getBackground().setCallback(null);
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
        unbindDrawables(((ViewGroup) view).getChildAt(i));
        }
    ((ViewGroup) view).removeAllViews();
    }
}

@Override
protected void onResume() {
    super.onResume();
    setContentView(R.layout.homescreen);
    createButtons();
    mCache.onResume();
    performAnimation(false);

    mTimer = new Countdown();
    mTimer.start();
}
@覆盖
受保护的void onPause(){
onPause();
mContext=null;
mTimer.cancel();
mTimer=null;
不可绑定的drawables(findviewbyd(R.id.home_root));
gc();
super.onPause();
}
私有void未绑定可提取项(视图){
if(view.getBackground()!=null){
view.getBackground().setCallback(null);
}
if(视图组的视图实例){
对于(int i=0;i<((视图组)视图)。getChildCount();i++){
未绑定的Drawables(((视图组)视图).getChildAt(i));
}
((视图组)视图);
}
}
@凌驾
受保护的void onResume(){
super.onResume();
setContentView(右布局主屏幕);
createButtons();
onResume();
表演(假);
mTimer=新倒计时();
mTimer.start();
}

任何关于如何解决此问题的建议都将不胜感激!谢谢。

您可以对内存中加载的所有位图使用
bitmap.recycle()
方法,只要确保以后使用位图时再次加载

根据文档,不应使用
recycle()
方法,因为在Java中尝试手动管理内存被认为是不好的做法。但是,如果您将它与我在您的
onPause()
中看到的
System.gc()
调用结合使用,理论上您可以通过明确说明不需要的位图来加快有问题手机的gc过程


我在您的代码片段中没有看到任何位图代码,也许更多的信息可以帮助澄清您的问题。

我不确定要发布哪些其他代码,因为我没有在此活动中显式加载位图。它们都只是在xml中设置为视图的src或background。