gpt4 book ai didi

android:清理应用程序销毁的内存

转载 作者:行者123 更新时间:2023-11-29 18:14:36 25 4
gpt4 key购买 nike

我正在开发一个实例化一堆位图对象的应用程序(例如,具有缓存位图的按钮,因此它们不必一次又一次地渲染)

现在,我意识到当我在我的华为移动设备上反复运行和启动该应用程序时,我会在该应用程序尝试为位图分配一些内存时收到 OutOfMemoryException。所以我猜是位图造成了麻烦。不过我知道有一个 bitmap.recycle() 方法。

现在我的问题是:清理内存的最佳做法是什么?为什么没有像 View::onDestroy() 这样可以实现清理目的的 View 方法?

编辑:示例

我的“CirclyButton”(扩展 Button)类总是在 onDraw 上绘制一个缓存的位图:

    @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(this.getDefaultBitmap(), 0, 0, paint);
}
private Bitmap getDefaultBitmap(){
if(mBitmapDefault == null){
mBitmapDefault = Bitmap.createBitmap(8*radius, 8*radius, Config.ARGB_8888);
Canvas canvas = new Canvas(mBitmapDefault);
this.drawDefault(canvas);
return mBitmapDefault;
}
return mBitmapDefault;
}

所以我猜这个分配的数据应该在某个地方回收......?

最佳答案

View 没有onDestroy 方法,因为 View 通常不会被销毁, Activity 会。如果一个 View 的 Activity 没有发生任何事情, View 将不会被销毁(除非你膨胀不同的布局......不是这种情况,对吧?),如果它的 Activity 发生了什么事,你确实有一个回调被调用。

如果有recycle() 方法,一定要调用它。并在 onDestroy 中删除对内存获取对象的所有引用,即:

@Override
public void onDestroy() {
object1 = null;
object2 = null;
//...
}

这样 GC 就可以完成它的工作了。我在使用 AdMob 的 AdView 时遇到了同样的问题,虽然他们确实有一个 destroy 方法,但它并没有真正帮助。但是删除我对 View 的引用解决了这个问题。

关于android:清理应用程序销毁的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8870715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com