Skip to content

Commit 9432dc9

Browse files
java-team-github-botDagger Team
authored andcommitted
Fix memory leak in ViewComponentManager
RELNOTES=n/a PiperOrigin-RevId: 931410876
1 parent 4bedb4b commit 9432dc9

1 file changed

Lines changed: 20 additions & 1 deletion

File tree

hilt-android/main/java/dagger/hilt/android/internal/managers/ViewComponentManager.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package dagger.hilt.android.internal.managers;
1818

19-
import dagger.hilt.android.components.ActivityComponent;
2019
import android.content.Context;
2120
import android.content.ContextWrapper;
2221
import androidx.fragment.app.Fragment;
@@ -34,6 +33,7 @@
3433
import dagger.hilt.android.internal.builders.ViewWithFragmentComponentBuilder;
3534
import dagger.hilt.internal.GeneratedComponentManager;
3635
import dagger.hilt.internal.Preconditions;
36+
import java.lang.ref.WeakReference;
3737

3838
/**
3939
* Do not use except in Hilt generated code!
@@ -86,6 +86,24 @@ public Object generatedComponent() {
8686
private Object createComponent() {
8787
Object componentManager = getParentComponentManager(/* allowMissing= */ false);
8888
if (hasFragmentBindings) {
89+
if (componentManager instanceof Fragment) {
90+
final WeakReference<ViewComponentManager> managerRef = new WeakReference<>(this);
91+
((Fragment) componentManager)
92+
.getLifecycle()
93+
.addObserver(
94+
new LifecycleEventObserver() {
95+
@Override
96+
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
97+
if (event == Lifecycle.Event.ON_DESTROY) {
98+
ViewComponentManager manager = managerRef.get();
99+
if (manager != null) {
100+
manager.component = null;
101+
}
102+
source.getLifecycle().removeObserver(this);
103+
}
104+
}
105+
});
106+
}
89107
return EntryPoints.get(componentManager, ViewWithFragmentComponentBuilderEntryPoint.class)
90108
.viewWithFragmentComponentBuilder()
91109
.view(view)
@@ -183,6 +201,7 @@ public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
183201
FragmentContextWrapper.this.fragment = null;
184202
FragmentContextWrapper.this.baseInflater = null;
185203
FragmentContextWrapper.this.inflater = null;
204+
source.getLifecycle().removeObserver(this);
186205
}
187206
}
188207
};

0 commit comments

Comments
 (0)