gpt4 book ai didi

java - 这是消除匿名类以降低内存泄漏风险的好技术吗(使用数据持有者)

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:56 26 4
gpt4 key购买 nike

匿名类很容易造成内存泄漏,尤其是在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

原因是,在ActivityFragment 中创建匿名类,匿名类将始终持有对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 的引用.我不是匿名类的粉丝,但我认为匿名的机会 OnClickListenerActivity 之外传递或 Fragment非常非常小。在我看来你是过于偏执了。

关于java - 这是消除匿名类以降低内存泄漏风险的好技术吗(使用数据持有者),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15528040/

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