2014-09-15 8 views
5

이것은 내 previous questions 중 하나에 대한 후속 질문입니다.Android에 정적 메소드가있는 클래스는 얼마나 오래 생깁니 까?

나는 모든 활동에 필요한 그래픽을로드하고 정적 클래스에 저장하는 LoadingActivity가 있습니다. 나는 LoadingActivity를 다시로드하려고하지 않을 때 다시 Home을 누르고 응용 프로그램을 다시 시작합니다. 많은 메모리가 필요하고 그래픽이 이미로드되어 여러 번 실행되기 때문에 LoadingActivity를 다시 시작할 필요가 없습니다. 제 질문은 정적 클래스가 얼마나 오래 살고 있습니까? 앱을 다시 시작한 후에도 사용 가능 여부를 신뢰할 수 있습니까? 아니면 일 수 있습니다. 일 수 있습니다. 안드로이드는 메모리 문제로 인해이를 없애거나 vm이 실행되는 동안 (즉, 전화가 실행되는 동안) 항상 여기에 있기 때문입니까?

+0

나는 그들이 당신의 신청 절차가 살아있는 한 계속 유지한다고 믿는다. 그러나 객체 참조를 Static으로 유지하는 것은 기기의 메모리가 제약되는 애플리케이션 개발에서는 결코 좋은 아이디어가 아닙니다. – waqaslam

+2

정적 클래스는 응용 프로그램 자체의 수명주기와 관련이 있습니다.이 수명주기는 Android의 변덕 AFAIK에 있습니다. 절대로 정적 클래스에 의존하지 마십시오. 기간. – Machinarius

+0

"정적 클래스"란 "정적 객체"에 대한 참조를 의미합니까? 당신은 class 클래스로 선언 된 클래스에 대해 묻는 것처럼 들릴 수도 있습니다. –

답변

6

Simon은 "정적 클래스"는 다른 언어로 다른 것을 의미하며 Java는 다른 언어의 정적 클래스와 매우 다른 것을 의미하지 않습니다. 그러나 나는 그것이 당신이 말하는 것에 대해 생각하지 않습니다. 강력한 정적 참조가 참조하는 객체가 가비지 수집 될 수 있는지 여부를 묻는 것 같습니다. 그렇다면 대답은 '아니오'입니다.

클래스는 클래스 Class의 개체로 표시되며 ClassLoader을 통해 연결할 수 있습니다. 그러므로 Class에 의해 참조되는 것은 ClassLoader에 도달 할 수있는 한 접근 할 수 있습니다. 시스템 클래스 로더의 경우 Java/Dalvik VM이 존재하는 한 길어야 도달 할 수 있습니다. 하지만 전화가 실행되는 동안 이 아닌이됩니다. 각 앱마다 독립적 인 VM이 만들어지기 때문입니다. 앱이 실행중인 전체 프로세스와 VM은 앱이 백그라운드에있을 때마다 종료 될 수 있습니다. 앱으로 돌아 가면 클래스가 다시로드됩니다.

ContentProvider 또는 foregound Service과 달리 정적 필드가 가장 좋은 선택 인 경우 앱이 다시 시작될 때마다 정적 참조가 초기화되었는지 확인하고 null 인 경우 다시 초기화해야합니다.

+0

이것은 잘못된 것입니다. 객체 내의 정적 내부 클래스를 참조하지 않는 한 정적 클래스와 같은 것은 존재하지 않습니다. 정적 참조가있는 POJO 또는 활동에 대해 이야기하고 있습니까? 또는 정적으로 초기화 된 클래스 필드? Java에는 정적 클래스가 없으므로 사용자가 명확 해 줄 때까지 답변을 투표합니다. – Simon

+0

명확함. **** –

+0

이론적으로, 주어진 ClassLoader 및로드 된 모든 클래스는 VM에 의해 언로드 될 수 있습니다. Android 앱에는 '시스템'로더가 아닌 맞춤형 로더가로드됩니다. 실제로 Dalvik은 클래스를 언로드하지 않으므로 논점이됩니다. – fadden