gpt4 book ai didi

java - setListener 时内存泄漏

转载 作者:行者123 更新时间:2023-11-30 09:28:44 25 4
gpt4 key购买 nike

以下示例中的内存泄漏。

1.SpeedHelper.java:

public class SpeedHelper {

interface Listener {
void OnSelected(String entry);
}
static Listener sListener;

static void setListener(Listener listener) {
sListener = listener;
}
static Listener getListener() {
return sListener;
}
static void clearListener() {
sListener = null;
}
}

2.CallSpeed.java

public class CallSpeed {

protected void speed() {
SpeedHelper.Listener litener = SpeedHelper.getListener();
if (litener != null) {
litener.OnSelected("mEntry");
}
}
}

3.MainActivity.java

public class MainActivity extends Activity {

private CallSpeed callspeed;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SpeedHelper.setListener(mCallSpeedListener);
callspeed = new CallSpeed();
callspeed.speed();
}
private SpeedHelper.Listener mCallSpeedListener = new SpeedHelper.Listener() {

@Override
public void OnSelected(String entry) {
Toast.makeText(getApplicationContext(), entry, Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
SpeedHelper.clearListener();
}
}

如何避免“sListener”的内存泄漏?

最佳答案

您的问题在于以下与静态字段关联的非静态封闭匿名类 sListener :

private SpeedHelper.Listener mCallSpeedListener = new SpeedHelper.Listener() {

@Override
public void OnSelected(String entry) {
Toast.makeText(getApplicationContext(), entry, Toast.LENGTH_SHORT).show();
}
};

因为这是一个非静态封闭类,它包含对其外部类的引用,MainActivity .此隐藏引用阻止了 MainActivity 的发布由 GC 分类,因为对象 mCallSpeedListener - 包含隐藏引用 - 存储在静态字段中 sListener使用说明 SpeedHelper.setListener(mCallSpeedListener); .因此,MainActivity永远不会收集对象,它的 onDestroy永远不会调用函数,所有内容都保留在内存中; GC 无法触及的地方。使用静态字段是一扇通向内存泄漏的大门,封闭类(匿名或非匿名)中隐藏引用的存在加剧了这个问题。

在您的情况下,您将不得不删除静态字段 sListener或者把匿名类改成普通类;一个没有对其外部的隐藏引用 MainActivity上课或直接调用clearListener在 Activity 终止时的另一个回调中。

关于java - setListener 时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13889621/

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