Obiekty wątku nie są zbierane po zakończeniu

Zauważyłem, że moja aplikacja wycieka z pamięci. Można to zobaczyć w DDMS i udało mi się uzyskać OutOfMemoryError.

Znalazłem źródło wycieku. Jedno z działań ma wątek działający w tle. Ten wątek został zatrzymanyonDestroy(). Kończy działanie, jak widać w DDMS.

Teraz, jeśli wątek jest uruchomiony, następuje wyciek, Activity nie jest zbieraniem śmieci po zniszczeniu, ponieważ odwołuje się do niego wątek. Jeśli wątek nie jest w ogóle uruchamiany, wszystko jest w porządku.

Oto prosty przykład pokazujący to:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    volatile boolean finished = false;
    byte[] memoryEater = new byte[4 * 1024 * 1024];

    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            while (!finished) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            Log.d(getClass().getName(), "Thread finished");
        }
    });

    @Override
    protected void onDestroy() {
        super.onDestroy();
        finished = true;
    }

    public void startActivity(View view) {
        startActivity(new Intent(this, MainActivity.class));
    }

    public void startThread(View view) {
        thread.start();
    }
}

Dodaj jeden przycisk do rozpoczęcia nowej aktywności i jeden do uruchamiania wątku. Rozpocznij nową aktywność. Po powrocie pamięć zostanie wyczyszczona tylko wtedy, gdy wątek nie został uruchomiony.

Jaka jest przyczyna tego zachowania?

questionAnswers(4)

yourAnswerToTheQuestion