아래 예에서 메모리 누수가 발생합니다.setListener 동안의 메모리 누수
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 "sListener"에 대한 메모리 누수를 방지하는 방법
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();
}
}
?
"활동이 종료 될 때 다른 콜백에서 clearListener를 직접 호출하십시오.", 나는 이것을 얻지 못했습니다. – user1905715
개인 SpeedHelper.Listener mCallSpeedListener = 새로운 SpeedHelper.Listener() { @Override 공공 무효 OnSelected (문자열 입력) { Toast.makeText (getApplicationContext(), 항목, Toast.LENGTH_SHORT) .show(); 'SpeedHelper.clearListener(); mCallSpeedListener = null; ' } }; 맞습니까? – user1905715
onStop 또는 onPause와 같은 onDestroy 이외의 다른 것을 사용하는 것에 대한 의견은 죄송합니다. 늦은 밤이었고 onDestroy는 GC 프로세스에 실제로 묶여 있지 않았습니다. GC가 활동 메모리를 수집 할 수없는 경우에도 호출됩니다. sListener에 메모리 누수가 있다는 결정을 어떻게 내 렸나요? – SylvainL