2016-03-24 15 views
12

Sto lavorando su una grande base di codice, e vedere in molti luoghi di questo tipo di codice:perché utilizzare WeakReference su ascoltatori Android?

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); 
    } 
} 

Sono un po 'confuso perché questo è usato è così tanti posti? Ho preso uno sguardo a questo documento, ma non ha chiarito bene il motivo per cui questo tipo di codice viene così pesantemente utilizzato su app sto lavorando su di esso

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

qualcuno può spiegare a me se questo è un modello comune? Se è così, perché?

+1

Di solito si tratta di un cerotto per i limiti sciatta sulla vita di un ascoltatore. Nota che nel tuo esempio, se mai è entrato in gioco lo scopo previsto di "WeakReference',' onClick (...) 'genererebbe un' NullPointerException'. Se questo codice non si blocca, l'uso di 'WeakReference' è probabilmente un esempio di [settaggio setta cargo] (https://en.wikipedia.org/wiki/Cargo_cult_programming). –

risposta

22

Un riferimento debole, in poche parole, è un riferimento che non è sufficientemente potente per forzare un oggetto a rimanere in memoria.

Gli autori di questo codice molto probabilmente volevano evitare la perdita del contesto di attività se l'oggetto RequestCustomData poteva sopravvivere all'attività stessa.

vi consiglio Romain Guy's post on this topic così come diversi casi specifici da evitare:

+3

Questa è davvero la ragione per cui le persone lo fanno. Ma di solito è meglio assicurarsi che l'ascoltatore * non * sopravviva all'attività in primo luogo. –

+0

Il collegamento al post di Romain Guy mostra _ "Errore durante la creazione di una connessione al database" _. Il link è rotto credo – Shashanth

Problemi correlati