android - 为什么定义一个static ImageView会导致内存泄露?
PHPz
PHPz 2017-04-18 09:06:00
0
7
689

提示说:不要把「Do not place android context classes in static fields, this is a memory leak.」

我知道activity context 不应该被放到static fields里面因为它在app生命周期内一直存在,而且如果它通过构造函数传递给其他class的话,其他class也会一直不被回收。

但为什么ImageView不能是static(我发现SwipeRefreshLayout也不行)?是因为ImageView包含contextButtonTextView之类的view就没有这种问题。

PHPz
PHPz

学习是最好的投资!

모든 응답(7)
迷茫

활동의 레이아웃을 채우려면 다음을 수행하세요.

으아악

어떤 방식으로든 채워진 뷰는 활동에 대한 참조인 컨텍스트에 대한 참조를 보유하고 있음을 알 수 있습니다.
이 시점에서 채워진 뷰가 정적으로 수정되면 정적 객체는 계속 지속됨 Activity에 대한 참조가 있기 때문에 Activity는 소멸될 수 없으며 Activity의 모든 컨트롤은 완전히 소멸 및 재활용되지 않아 궁극적으로 메모리 누수가 발생합니다.

PS: 정적 보기를 사용하는 이유 특별한 비즈니스 요구 사항이 있나요?

Ty80

정적 변수는 메모리 블록에 별도로 존재합니다. 컨트롤(질문의 ImageView)은 활동에 대한 참조를 보유합니다. 이 경우 메모리에 항상 참조(포인터 이해)가 있기 때문에 활동을 완전히 삭제할 수 없습니다. 따라서 활동을 재활용할 수 없으며 자연스럽게 메모리 누수가 발생합니다!
Android에서는 정적 수정 컨트롤을 사용하지 않는 것이 좋습니다!

阿神

뷰는 컨텍스트를 보유해야 합니다(그렇지 않으면 setXXX(int resid) 클래스의 기능을 구현할 수 없습니다)

Button/TextView가 왜 경고하지 않는지 모르겠습니다

刘奇

정적 변수는 자동으로 재활용할 수 없습니다
뷰를 정적 변수로 설정하면 뷰에 활동에 대한 참조가 보관됩니다.

迷茫

IPC의 말: 정적은 Android의 네 가지 주요 구성 요소에 대한 킬러입니다.

阿神

현재 활동보다 정적 수명주기가 매우 길기 때문입니다

刘奇

이렇게 표현하자면, 클래스 파일이 바이트코드로 컴파일된 후, 메소드 영역이 로드되면 정적 변수가 초기화되며, 정적 변수는 수정되지 않고 항상 존재하게 됩니다. 활동이 쓸모없게 되면 gc는 활동이 참조되는지 확인하기 위해 힙에 공간을 신청하게 됩니다. 🎜> 따라서 가상 머신이 프로세스를 종료할 때까지(즉, 앱이 중지될 때까지) GC를 재활용할 수 없으므로 메모리 누수가 발생합니다. context

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!