- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
匿名类很容易造成内存泄漏,尤其是在Android世界中,Activity或Fragment会因为配置变化而突然销毁。以下是众多示例之一。
http://chaosinmotion.com/blog/?p=696
http://blog.andresteingress.com/2011/10/12/anonymous-inner-classes-in-android/
https://blogs.oracle.com/olaf/entry/memory_leaks_made_easy
原因是,在Activity
或Fragment
中创建匿名类,匿名类将始终持有对Activity
的隐式引用或 fragment
。因此,当 Activity
由于配置更改而趋于失效时,如果匿名类被暴露并被外界持有,则无法进行垃圾回收。
所以,我想知道,使用数据持有者技术是否是一种完全消除匿名类、降低内存泄漏风险的好方法?或者,我是不是太偏执了?
public class HomeMenuFragment {
private Parcelable selectedInfo = null;
private List<View> homeMenuRows = new ArrayList<View>();
private void fun() {
...
...
row.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// homeMenuRows is member variable
for (View r : homeMenuRows) {
r.setSelected(false);
}
row.setSelected(true);
// selectedInfo is member variable
selectedInfo = watchlistInfo;
}
});
}
}
public class HomeMenuFragment {
private static class Holder {
public Parcelable selectedInfo = null;
public final List<View> homeMenuRows = new ArrayList<View>();
}
private final Holder holder = new Holder();
private static class MyOnClickLisnter implements OnClickListener {
private final Holder holder;
private final LinearLayout row;
private final WatchlistInfo watchlistInfo;
public MyOnClickLisnter(Holder holder, LinearLayout row, WatchlistInfo watchlistInfo) {
this.holder = holder;
this.row = row;
this.watchlistInfo = watchlistInfo;
}
@Override
public void onClick(View arg0) {
for (View r : holder.homeMenuRows) {
r.setSelected(false);
}
row.setSelected(true);
holder.selectedInfo = watchlistInfo;
}
}
private void fun() {
...
...
row.setOnClickListener(new MyOnClickLisnter(holder, row, watchlistInfo));
}
}
最佳答案
这样的重构没有帮助。 View
Holder
中的对象还保留对 Activity
的引用, 所以如果 Holder
暴露给外界你有内存泄漏。另外,你的 MyOnClickLisnter
例如,即使它被声明为 static
, 持有对 Holder
的明确引用和一个 LinearLayout
,两者都持有对 Activity
的引用.我不是匿名类的粉丝,但我认为匿名的机会 OnClickListener
在 Activity
之外传递或 Fragment
非常非常小。在我看来你是过于偏执了。
关于java - 这是消除匿名类以降低内存泄漏风险的好技术吗(使用数据持有者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528040/
我有一个 Magento 网站,其中似乎没有出现交叉销售产品。 在查看 Stack 和 Google 之后,似乎“重新索引数据”已经为很多人解决了这个问题。 我的问题是,执行此任务是否有任何风险?或者
为了避免在某些简单命令中使用括号,我编写了以下运算符以创建新的图形窗口。我的问题是:除了明显无法在我的变量“ newdev”上执行“ not”功能之外,我是否有“破坏” R中任何内容的风险? # fu
你好 我正在开发一个联系表格。我正在使用邮件功能将其通过电子邮件发送给网站管理员。 是否存在有人可以注入(inject)恶意 javascript 和任何其他注入(inject)攻击的风险? $to
我想知道在 Objective C 中将消息传递给 nil 对象不会执行任何操作,这样依赖是否存在任何风险。 在我的代码中,我有很多对 UIKit 和其他对象的弱引用,这些引用可能随时被清除。由于我来
我被指派修复遗留代码的安全问题,并获得了安全扫描的结果: Poor Error Handling: Server Error Message ( 10932 ) 基本上,当扫描尝试使用一些奇怪的代码进
我有一个匿名类,在创建时需要使用自引用。我的业务代码可以简化为如下代码,我知道这段代码: final Runnable runnable=new Runnable() { @Override
有几个基类是我无法控制的:- class BaseNode // Just a POD class. No VTable { void foo(); } class BaseHost { publ
这个问题已经有答案了: Do I have to guard against SQL injection if I used a dropdown? (11 个回答) 已关闭 7 年前。 我希望我的网
这是根据用户提供的输入创建表的简单过程: PROCEDURE `hackProcedure`( IN tab_name VARCHAR(63)) BEGIN IF (tab_name REGEXP '
我知道在您的网站上显示用户输入时,使用 php 中的 htmlentities() 之类的函数来清理用户输入很有用。但是这样的事情会带来 XSS 风险吗? " /> 像这样清理输入会更好吗? " />
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
谁能阐明图表上曲线的含义、阴影区域的含义以及轴的含义? 最佳答案 这是对风险随时间变化的预测。在 NCrunch wiki 中有一些文档对此进行了描述:http://wiki.ncrunch.net/
我有一个包含 200 万条记录的集合,如果可能的话,我希望在不停机的情况下在其上添加单个字段索引。 我的问题是:是否可以/需要备份集合?使用 azure 门户创建索引在后台运行它而不会造成任何服务停机
我正在使用Symfony2并使用 CSRF token 保护我的表单。 我有一个基于 Ajax 调用的评论系统。如果用户想要编辑他的评论,则会发生以下情况: 用户点击编辑按钮。 通过 ajax 加载“
Checkmark 扫描了我们的代码并显示这些代码存在二阶注入(inject)的风险像这样的代码 @SuppressWarnings("unchecked") public List> findByS
我有一个包含几百行的小型 MySQL 数据库(全部为文本,无图像)。我正在使用 iQuery 请求所有行并在客户端进行所有过滤。 iQuery 代码如下: $(document).ready( fun
如果我的网站只允许用户查看他们自己提交的数据,而永远不允许其他用户提交的数据(即没有一般的“帖子”等)——那么我的网站是否真的存在 XSS 风险? 我仍将致力于 XSS 解决方案(如 httmlspe
我正在构建一个 iframe,而不是 innerHTML , 但带有 createElement .. 我使用了两个不受信任的字符串: iframeEl.title = untrustedStr1;
我正在生成如下动态prepareStatement(字段可能会根据请求输入而变化)。 Veracode 扫描持续报告 SQL 注入(inject)风险 - CWE-89:SQL 命令中使用的特殊元素的
我有一个可以在英语和德语之间切换语言的应用程序。当使用德语时,我希望货币显示将自动转换为德语格式。因此,在我的程序中,我必须检查区域设置,然后根据所选语言转换货币。我选择使用 locale.setDe
我是一名优秀的程序员,十分优秀!