如何确保Android位图从堆中清除
我有一个活动(activity1),它使用了大量的位图。我还有另一个加载位图的活动(activity2)。在某些手机上运行时,我在activity2中遇到OOM错误。我已经找到了由activity1中的布局引起的错误。如果我取出activity1中的所有位放大器,并用十六进制颜色替换它们,那么activity2中就不会出现OOM错误 因此,我假设在调用activity1的onPause或onDestroy方法时,我在activity1中使用的位图不会从堆中删除。到目前为止,我已经尝试了来自的答案,但我仍然得到我的错误。到目前为止,这里是我的onPause和onResume方法如何确保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中使用的位图不会从堆中删除。到目前为止,我已经尝试了来自的答案
@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。