Skip to content

Instantly share code, notes, and snippets.

@SIDOVSKY
Created March 29, 2021 20:51
Show Gist options
  • Select an option

  • Save SIDOVSKY/ad5b05ddad2e812c38c0d57926d3381e to your computer and use it in GitHub Desktop.

Select an option

Save SIDOVSKY/ad5b05ddad2e812c38c0d57926d3381e to your computer and use it in GitHub Desktop.
Attach IDisposable to a Lifecycle.Event in Xamarin.Android

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);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment