gpt4 book ai didi

java - Android 告诉我我的位图在我实际回收之前就被回收了

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:01 24 4
gpt4 key购买 nike

我正在从 XML 中获取我的位图:

//Get bitmap from drawable
bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);
backgrounds = bd.getBitmap();

//Do required work with bitmap (Will just use a log statement here for testing
Log.v("NewTag","Testing: "+bd.getBitmap().getPixel(0, 0));

//Now recycle this large bitmap
bd.getBitmap.recycle();
bd=null;
backgrounds.recycle();
backgrounds=null;

我第一次运行这段代码时,一切都很好。但是,当我退出我的应用程序(使用后退键),然后重新启动该应用程序时,它可能也可能不工作。有时,我会得到一个错误:

Can't call getPixel() on a recycled bitmap

为什么?我什至还没有回收它。或者更准确地说,它似乎不是在重新创建位图并记住上次的回收。

如果我使用 BitmapFactory 获取位图,则不会发生此问题(不幸的是,我不能这样做,因为我必须从 XML 别名获取此特定位图)。

同样在安装 Lollipop 之前,这工作正常(只要我有 bd = null)。

我已经连续 2 天解决这个问题了,所以如果有人能对它有所启发,我将不胜感激。

编辑

我尝试过@aga 的建议,即不回收/取消 bd,但这没有任何区别。位图在重新创建后仍然“已经”被回收(同样,间歇性地)。

此外,当这样记录时:

Log.v("NewTag","Backgrounds: "+backgrounds);

我注意到失败时,记录的引用与上一次相同。所以……

enter image description here

最佳答案

Resources 类有 caches for resources loaded from your APK .当您回收 DrawableBitmap 时,您会破坏缓存的对象。 Resources 缓存无法知道这一点,因此在您下次请求该资源时它们会很乐意返回相同的对象。

当您的应用程序进程终止时,所有内存状态都会丢失,包括资源缓存——所以事情会再次运行(一次)。请注意,“退出”应用程序或销毁 Activity 并不一定意味着您的进程会终止。

关于java - Android 告诉我我的位图在我实际回收之前就被回收了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27774331/

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