5

In unserem Projekt fanden wir Speicherverluste aufgrund von Netzwerkrückrufen. Die Netzwerkanforderung wird von einem Fragment ausgelöst und die Antwort wird durch einen Rückruf an das Fragment zurückgegeben. Das Problem ist, dass, wenn der Benutzer das Fragment verlässt, kein Müll gesammelt wird, da der Rückruf damit verbunden ist. Daher gibt es eine Erinnerung Leck.Schwache Referenz für Netzwerk Callback schlechte Idee?

Meine vorgeschlagene Lösung war die Callback-Referenz auf OnStop Fragment zu annullieren. Auf diese Weise kann GC sich darum kümmern.

Eine andere Lösung, die mein Mitarbeiter vorgeschlagen hat, ist, zu WeakReference zu den Rückrufen zu verwenden. Das Problem dabei ist, dass der Rückruf oft Müll sammelt, so dass wir nicht einmal eine Antwort von den Rückrufen erhalten (einige Zeit, wenn der Benutzer auf eine Antwort wartet). Das Problem ist Schwache Referenz kann Garbage Collection mit GC jederzeit gesammelt werden.

Ich nehme an, in diesem Szenario ist die Verwendung von WeakReference keine gute Idee.

Was denkst du?

Antwort

2

Ich denke, Sie sollten schwache Referenz für die äußere Klasse, aber nicht den Rückruf verwenden. Es ist nicht der Callback wirklich Leck aber die äußere Klasse. Das bedeutet, dass der von Ihnen verwendete Rückruf nicht der Rückruf ist, sondern der Rückruf.

Antworten Sie mir, wenn Sie Fragen haben :)

1

Ich denke, die WeakReference für Rückruf Zuhörer kein gutes Muster ist, weil Sie Zuhörer sehr GC gewesen Rückruf kann leicht dann führen, dass Sie nie Callback erhalten. Allerdings stimme ich @MacFang Antwort It's not the callback really leak but the outer class völlig zu.

0

Stimmen Sie mit beiden Antworten überein. Danke, dass du dir Zeit genommen hast, zu antworten.

Die Lösung war, das "Fragment" in die schwache Referenz und nicht den Callback zu wickeln, so dass, wenn der Netzwerkvorgang abgeschlossen ist, überprüfe ich, ob das Fragment noch am Leben ist. GC wird Müll das Fragment sammeln, wenn es nicht da ist.