Usage:
// Inside a Fragment or Activity
IDisposable.AutoDispose(this, Lifecycle.Event.OnDestroy);
// One more option for a Fragment
IDisposable.AutoDispose(ViewLifecycleOwner, Lifecycle.Event.OnDestroy);Usage:
// Inside a Fragment or Activity
IDisposable.AutoDispose(this, Lifecycle.Event.OnDestroy);
// One more option for a Fragment
IDisposable.AutoDispose(ViewLifecycleOwner, Lifecycle.Event.OnDestroy);| using AndroidX.Lifecycle; | |
| using System; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| namespace AutoDispose | |
| { | |
| public static class AutoDisposeExtensions | |
| { | |
| public static IDisposable AutoDispose(this IDisposable self, ILifecycleOwner lifecycleOwner, Lifecycle.Event disposeEvent) | |
| { | |
| return AutoDispose(self.Yield(), lifecycleOwner, disposeEvent).First(); | |
| } | |
| public static T AutoDispose<T>(this T self, ILifecycleOwner lifecycleOwner, Lifecycle.Event disposeEvent) where T : IEnumerable<IDisposable> | |
| { | |
| var observer = new LifecycleEventObserver(); | |
| observer.StateChanged += (s, e) => | |
| { | |
| if (e == disposeEvent) | |
| { | |
| foreach (var disposable in self) | |
| { | |
| disposable.Dispose(); | |
| } | |
| s.Lifecycle.RemoveObserver(observer); | |
| } | |
| }; | |
| lifecycleOwner.Lifecycle.AddObserver(observer); | |
| return self; | |
| } | |
| private static IEnumerable<T> Yield<T>(this T item) | |
| { | |
| yield return item; | |
| } | |
| } | |
| } |
| using AndroidX.Lifecycle; | |
| using System; | |
| namespace AutoDispose | |
| { | |
| public class LifecycleEventObserver : Java.Lang.Object, ILifecycleEventObserver | |
| { | |
| public event Action<ILifecycleOwner, Lifecycle.Event> StateChanged = (_, __) => { }; | |
| public void OnStateChanged(ILifecycleOwner source, Lifecycle.Event e) | |
| { | |
| StateChanged.Invoke(source, e); | |
| } | |
| } | |
| } |