Use strong references to callbacks in Stripe and CustomerSession #863
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Stripe
andCustomerSession
methods accept callback objectsthat typically hold references to
Activity
objects. The bestpractice in Android is that references to
Activity
objectsshould be weakly held for long-running background tasks, because
the
Activity
may go away (e.g. user leaves activity before taskis complete). The change was first introduced in #666.
After this change, users began reporting that callback objects
would mysteriously be garbage-collected by the OS. I was able
to reproduce this as well, and found a work-around by moving
anonymous inline classes to instance variables - see 2b74328.
Android will GC objects that are no longer strongly referenced.
When inlined, the callback objects were no longer strongly
referenced once the method completed (e.g. in 2b74328, the
left-side of
AddSourceActivity#onActionSave
); moving theseobjects to be instance variables meant that they were now
strongly-referenced by the Activity. This explains why the GC
issues were resolved with this change.
In conclusion, the correct solution is to have the callback
objects weakly-reference
Activity
objects, rather thanweakly-reference the callback objects themselves.
Motivation
ANDROID-340
Testing
Manually tested