2016-03-24 10 views
12

pracuję na dużą bazę kodu, i zobaczyć w wielu miejscach tego typu kodu:dlaczego warto używać WeakReference na Android Słuchacze?

public static class RequestCustomData implements View.OnClickListener { 
    WeakReference<MainActivity> mainActivity; 

    public RequestCustomData(MainActivity activity) { 
     mainActivity = new WeakReference<>(activity); 
    } 

    @Override 
    public void onClick(View view) { 
     MainActivity activity = mainActivity.get(); 
     activity.requestCustomData(true, null); 
    } 
} 

jestem trochę zdezorientowany, dlaczego ten jest używany jest tak wiele miejsc? Wziąłem spojrzeć na ten dokument, ale nie dobrze wyjaśnić, dlaczego ten typ kodu jest tak często używane w aplikacji pracuję nad nim

https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references

Każdy może wyjaśnić mi, czy jest to wspólny wzór? Jeśli tak, dlaczego?

+1

Zazwyczaj jest to zespół pomocy dla niechlujstwa limitów trwania słuchacza. Zauważ, że w twoim przykładzie, jeśli zamierzony cel 'WeakReference' kiedykolwiek wszedł do gry,' onClick (...) 'rzucił' NullPointerException'. Jeśli ten kod się nie zawiesza, użycie 'WeakReference' jest prawdopodobnie przykładem [kultowego programowania ładunków] (https://en.wikipedia.org/wiki/Cargo_cult_programming). –

Odpowiedz

22

Słabe odniesienie, po prostu, jest referencją, która nie jest wystarczająco silna, aby zmusić obiekt do pozostania w pamięci.

Autorzy tego kodu najprawdopodobniej chcieli uniknąć wycieku kontekstu działania, jeśli obiekt RequestCustomData mógł przeżyć samą czynność.

Polecam Romain Guy's post on this topic jak również kilka konkretnych przypadków należy unikać:

+3

To jest powód, dla którego ludzie to robią. Ale zwykle lepiej jest upewnić się, że słuchający * nie * przeżyje aktywności na samym początku. –

+0

Link do posta Romain Guy pokazuje "Błąd podczas ustanawiania połączenia z bazą danych" _. Link jest uszkodzony, tak myślę – Shashanth

Powiązane problemy