I 클래스가 있습니다스레드 영원히
class RenderView implements Runnable {
Thread renderThread;
public void run() {
while(!Thread.currentThread().isInterrupted()) {
//does some work
}
}
//At some point in executed code, inside RenderView class (i'm sure it's executed)
renderThread = new Thread (this);
//When activity is closed (also, i'm sure this part is executed)
renderThread.interrupt();
가 그리고 renderThread 정말 중지를 (적어도, 실행() 메소드는 종료됩니다).
하지만 어떤 이유로 든 내 활동을 종료 한 후 내 코드에 renderView에 대한 참조가 남아 있습니다. 이로 인해 엄청난 메모리 누수가 발생합니다.
그리고 HPROF 덤프는 나에게 말한다 : java.lang.Thread의 (이 하나가 GC의 루트에) 가 대상에 대한 참조 (mypackage.RenderView)
나는 아무 생각을 가지고 왜 Thread 클래스 이미 스레드를 완료 했음에도 불구하고 내 스레드에 대한 참조를 유지합니다! 아이디어가 있으십니까?
EDIT : renderView는 Activity B에서 참조됩니다. 따라서 액티비티를 종료하면 renderThread에 대한 참조가 계속 도달 할 수 있습니다. 하지만 여전히 renderThread 설정 null = null : 작동하지 않습니다. 내가 MAT Analyzer를 통해 알 수 있듯이, 은 renderView를 가비지 수집에서 유지하는 유일한 것이 java.lang.Thread의 위어 참조입니다.
안드로이드 솔루션은 스레드를 관리하지 않습니다. runOnUIThread에서 AsyncTask를 사용하면 대부분의 작업에서 작동합니다. –
그러나 이들이 작동하지 않는 특별한 경우를 발견했다면 자세히 설명하십시오. –