5

Nel nostro progetto abbiamo rilevato perdite di memoria dovute a callback di rete. La richiesta di rete viene generata da un frammento e la risposta ritorna attraverso un callback al frammento. Il problema è che quando l'utente lascia il frammento, non è garbage collection dal momento che il callback è legato ad esso. Quindi c'è una perdita di memoria.Riferimento debole per cattiva idea di callback di rete?

La mia soluzione proposta era di annullare il riferimento di callback su onStop del frammento. In questo modo, GC può prendersene cura.

Un'altra soluzione suggerita dal mio collega è quella di utilizzare WeakReference per i callback. Il problema è che il callback riceve spesso i garbage collection in modo tale da non ottenere nemmeno una risposta dai callback (alcune volte quando l'utente è in attesa di una risposta). Il problema è che Weak Reference può essere raccolto con garbage collection in qualsiasi momento.

Presumo in questo scenario, l'utilizzo di WeakReference non è una buona idea.

Cosa ne pensate?

risposta

2

Penso che dovresti usare un riferimento debole per la classe esterna ma non il callback. Non è proprio la callback a perdere ma la classe esterna. Significa che la richiamata che stai utilizzando non è quella che viene raccolta ma la richiamata.

Rispondi me se avete domande :)

1

Penso che la WeakReference per la richiamata ascoltatore non è un buon modello, perché è richiamata ascoltatore può stato GC molto facilmente, allora la causa di richiamata non vieni chiamato. Tuttavia sono totalmente d'accordo con @MacFang risposta It's not the callback really leak but the outer class.

0

D'accordo con entrambe le risposte. Grazie per aver dedicato del tempo per rispondere.

La soluzione era di avvolgere il "frammento" nel riferimento debole e non nel callback, in modo che quando l'operazione di rete è completata, controllo se il frammento è ancora vivo. GC raccoglierà il frammento quando non è in giro.

Problemi correlati