2017-01-05 3 views
-1

Допустим, у меня есть поток, определенный следующим образом:Может ли установка Looper в потоке вызывать утечку памяти в Java?

public class MyThread extends Thread { 

    Looper someLooper; 

    public void setLooper(Looper looper){ 
     someLooper= looper; 
    } 

    @Override 
    public void run() { 
     System.out.println("MyThread - START "+Thread.currentThread().getName()); 
    System.out.println("mylooper:"+someLooper.toString()); 

     } 
    } 
} 

Теперь, скажем, на экране mainThread деятельности я это сделать:

MyThread t = new MyThread(); 
t.setLooper(Looper.getMainLooper()); 
t.start(); 

Будет ли это утечка памяти, так как петлитель навсегда ссылается на дочерний поток? Будет ли GC иметь возможность собирать память из mainThread-активности или она должна ждать, пока петлеузер не будет освобожден? Я думаю, что это не будет утечкой памяти, поскольку петлитель связан с потоком, а не с контекстом активности. Мне нужно подтверждение.

+0

Является ли объект подходящим для сбора мусора, является функцией того, кто содержит ссылку на этот объект, а не на какие объекты, на которые ссылается объект, ссылается на объект. Таким образом, значение члена 'someLooper'' MyThread' не влияет на то, соответствует ли этот поток GC. –

ответ

1

Основная нить никогда не заканчивается до тех пор, пока ваше приложение работает, поэтому нет никакой утечки памяти. Нет ссылки на Activity in Looper - по крайней мере, не напрямую (сообщения, добавленные в Looper, могут иметь ссылки на Activity, но это другое дело, и это действительно проблема, если у них очень длинная задержка).