0
는 다음과 같은 두 가지 클래스를 가정? 어느 활동이 GCed를받지 못하게됩니까? 위의 Listener 구현에 문제가 있습니까?가비지 컬렉션 (자바/안드로이드)
는 다음과 같은 두 가지 클래스를 가정? 어느 활동이 GCed를받지 못하게됩니까? 위의 Listener 구현에 문제가 있습니까?가비지 컬렉션 (자바/안드로이드)
귀하의 예는 몇가지 실수가 있습니다.
예를 들어 Network를 인스턴스화하지 않고 인스턴스화 할 때마다 정적 필드가 다른 인스턴스를 참조합니다. 당신이 네트워크 싱글에서 활동 인스턴스를 제거하지 않으면 네트워크를 작성하는 더 적절한 방법은, 그러나 다음
public class Network {
private static final Network INSTANCE = new Network();
private Network() {/*empty*/}
public static Network get() {
return INSTANCE;
}
//rest of the code ommitted
}
것 (네트워크 클래스의 정적 필드 인스턴스를 - 당신은 어떤 시점에서 초기화 가정) 그 인스턴스는 항상 ArrayList에 추가 된 Activity 객체에 대한 참조를 갖습니다. 이렇게하면 쓰레기 수거가 불가능합니다.
죄송합니다. 코드가 실제 코드보다 의사 코드가 될 의도가 더 있었기 때문에 언급하지 않았습니다. 따라서 Activity가 여전히 ArrayList에 있다면, Activity가 일시 정지/소멸 될 때'network.removeListener (this);'를 추가하고 호출해야합니까? 그렇다면 왜 다른 API로 그 동작을 보지 못합니까? – StackOverflowed
그건 그걸 할 수있는 방법 중 하나입니다. 어떤 다른 API를 언급하고 있습니까? – dkateros
예를 들어 MediaPlayer setOnPreparedListener는 작은 예제입니다. – StackOverflowed