我有一个使用相当大量位图的活动(activity1)。我还有另一个加载位图(activity2)的活动。在某些手机上运行时,我在activity2中收到OOM错误。我已经将错误跟踪到由activity1中的布局引起的。如果我取出activity1中的所有bitamps,并用只有十六进制颜色替换它们,那么我在activity2中没有得到OOM错误。
因此,我假设当调用activity1的onPause或onDestroy方法时,我在activity1中使用的位图不会从堆中删除。到目前为止,我已经尝试了here的答案,但我仍然得到了我的OOM错误。到目前为止,这是我的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();
}
如何解决此问题的任何建议将不胜感激!感谢。
答案 0 :(得分:0)
您可以对内存中加载的所有位图使用bitmap.recycle()
方法,只要您确保在使用它们时再次加载它们。
根据文档,不应使用recycle()
方法,因为尝试在Java中手动管理内存被视为不良做法。但是,如果您将此与我在System.gc()
中看到的onPause()
电话结合使用,理论上可以通过明确说明不需要的位图来加速有问题电话的GC过程。
我在您的代码段中没有看到任何位图代码,也许更多信息可以帮助澄清您的问题。