- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在尝试实现 Drawable 的小型内存缓存时,我了解到要避免在关闭 Activity 后发生内存泄漏,我需要取消绑定(bind)这些 Drawable:将它们的回调设置为 null。
因为维护缓存在每个 Activity 中的 Drawable 需要额外的代码,所以我尝试在 setImageDrawable(drawable)
之后立即解除它们的绑定(bind),到目前为止我没有看到任何后果.
这是来自 MyImageView 类的代码(extends ImageView
):
setImageDrawable(drawable);
d.setCallback(null);
在调试器中,我可以清楚地看到,在第一行回调之前为 null,在第一行之后它被设置为这个 imageView,之后我再次将它设置为 null。它通常在那之后显示..
setCallback (Drawable.Callback cb)
的文档说明:
Bind a Drawable.Callback object to this Drawable. Required for clients that want to support animated drawables.
因为我不需要动画可绘制对象,所以我不明白为什么我不应该这样做,但令我困扰的是,在一些关于 Android 中关于可绘制对象的内存泄漏的博客中,只有在 Activity 完成后才这样做。问题是,为什么在绑定(bind)到 ImageView
时总是自动设置回调?
是否存在一些边界条件,回调设置为 null 的那些可绘制对象会导致问题?不显示或 NPE?
最佳答案
您不应该缓存 Drawable——Drawable 对象是有状态的,旨在供一个且只有一个所有者使用。
如果你想实现缓存,你应该缓存可绘制对象的常量状态。
用这个检索常量状态:
http://developer.android.com/reference/android/graphics/drawable/Drawable.html#getConstantState()
(注意此方法可以返回 null;并非所有 Drawable 都具有常量状态。)
您稍后可以使用以下方法从常量状态实例化新的 Drawable:
另请记住,Resources 已经使用此工具为您维护了一个 Drawables 缓存,因此您无需为从 Resources 检索的任何 Drawables 实现自己的缓存。
而且,如果您在资源之外创建自己的 Drawable,我强烈建议对底层数据(例如从网络下载的位图)进行缓存,然后尝试破坏常量状态。 (同样,绝对不要自己缓存 Drawable 对象。)
关于android - drawable.setCallback(null) 的后果;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648740/
在编译iPhone应用程序时,有一个针对“优化”架构(仅限armv7)与标准armv6/armv7架构的设置。 编译纯armv7架构有什么好处/后果? 最佳答案 除非您的程序需要 OpenGLES 2
例如我有这段代码: Sub Month() Dim Conn As New Data.OracleClient.OracleConnection Conn.Open() Try
使用子域在 Wordpress 或 Blogger 上托管博客是否有任何 SEO 劣势?我不想为自己的站点创建博客模块而费心——我宁愿只设置一个 CNAME 条目并将子域指向一个免费的 Wordpre
我们使用免费 API 制作简单的 501C3 map 。通常我们的地理编码使用率很低,但我们所做的更改 [oops] 触发了所有 >2500 条记录的重新请求。 我们可以等待 24 小时“超时”。 我
我在 Heroku 上有一个 Web 应用程序,它一直使用大约 300% 的允许 RAM (512 MB)。我看到我的日志充满了错误 R14(超出内存配额)[每秒一个条目]。尽管状况不佳,我的应用程序
我在我的应用程序中以 FileChannel.MapMode.READ_WRITE 模式创建/使用内存映射文件。这些文件在应用程序的整个生命周期中创建和删除。 由于 GC 不一定释放直接缓冲区以_取消
增加最大连接数有什么害处?即使使用当前设置和复制设置,我们的主服务器也会提示已经有太多客户端。 在 postgresql.conf 中将最大连接数增加到 400 是否安全,或者我的服务器是否有问题,因
我正在处理的网站存在一些小问题,我想发布一个测试版本,在其中进行一些调整以查看效果(我想在移动设备上进行测试设备也是如此,因此拥有实时版本肯定是在多个设备上进行测试的最简单方法)。 理想情况下,我想要
我正在构建一个网站,其中导航栏的元素使用 HTML5 的 Canvas 元素进行动画处理。例如,按钮是 float 的圆圈。这个想法是按钮的文本将 float 到这些圆圈的右侧。我想知道,就 SEO
我是一名优秀的程序员,十分优秀!