避免内存泄漏。 (弱引用)
Avoiding Memory Leak. (WeakReference)
场景是这样的:
带有条目的 XAML 有一个方法 linked 到 textchanged 的事件。
在将 UI 组件(在本例中为网格)封装在 classes 中以提高代码的可维护性后,我发现了下一个问题:
我不能 link 方法的事件到网格上的特定按钮。问题是我调用了这个方法(它有一个 DisplayActionSheet 函数,不能用简单的 class 调用。它应该来自任何类型的页面s class 或应用程序 class).
所以我的第一个方法是将按钮封装在另一个 class 中。
我在页面中创建了这个对象(按钮),linked 到方法的事件(也在页面中编码。现在我可以,在页面的 class 中)并传递这个对象到网格对象构造函数的新实例(另一个 class)。最后,我将网格(带有正确 link 的按钮)添加到页面。
嗯,恐怕这不是个好主意。我假设这可能是在“内存泄漏问题”(与删除内存中的对象相关的问题以及那些在不同 classes 之间有引用的问题,是什么组成它们,不是吗? t?),只是在不同的 classes(网格、按钮和页面)之间创建引用。
研究解决方案后,似乎可以委托此方法的事件。
但我做不到,这很容易(当你知道的时候)但是示例不是我的案例准备的(或者我找不到)。你能帮个忙吗? :)
我post代码的想法,它是在ListView内部,网格内部的Button上实现的(有点复杂,但我想简化它)。
//This code is called in CarouselPage
// ..............
//ButtonEstadoTarea is type Button
ButtonEstadoTarea bet = new ButtonEstadoTarea();
//OnStartClicked is allocated is this CarouselPage
//
bet.Clicked += this.OnStartClicked;
ListViewIntervencion lvi = new ListViewIntervencion();
lvi.ItemTapped += this.OnItemTapped;
lvi.ItemsSource = intervencion.Interv;
GridCabeceraIntervencion gci = new GridCabeceraIntervencion(intervencion, lvi);
var intervencionContent = new ContentPage
{
Content = gci,
};
this.Children.Add(intervencionContent);
async void OnStartClicked(object sender, EventArgs args)
{
var action = await DisplayActionSheet("Procesar Tarea", null, "Cancel", "Iniciar", "Pausar", "Bloquear", "Terminar");
// MORE MAGIC...
}
谢谢大家。
所有移动平台(ios、android、xamarin)使用弱引用存储(页面、activity、UIViewcontroller)是一个很好的做法。您可以像这样实现对页面的引用:
WeakReference<Page> _pageReference;
public Page Page{
get {
Page _page = null;
_pageReference.TryGetTarget(out _page);
return _page;
}
set{
_pageReference = new WeakReference<Page>(value);
}
}
并且不要忘记在访问页面 属性 时检查是否为 null。这样你就不会有内存泄漏。要了解有关弱引用的更多信息,请阅读:
https://msdn.microsoft.com/en-us/library/gg712738(v=vs.110).aspx
我建议使用 MVVM 方法,使用 FreshMvvm,将按钮命令绑定到模型,并使用 CurrentPage 参数
显示操作 sheet
场景是这样的:
带有条目的 XAML 有一个方法 linked 到 textchanged 的事件。
在将 UI 组件(在本例中为网格)封装在 classes 中以提高代码的可维护性后,我发现了下一个问题:
我不能 link 方法的事件到网格上的特定按钮。问题是我调用了这个方法(它有一个 DisplayActionSheet 函数,不能用简单的 class 调用。它应该来自任何类型的页面s class 或应用程序 class).
所以我的第一个方法是将按钮封装在另一个 class 中。 我在页面中创建了这个对象(按钮),linked 到方法的事件(也在页面中编码。现在我可以,在页面的 class 中)并传递这个对象到网格对象构造函数的新实例(另一个 class)。最后,我将网格(带有正确 link 的按钮)添加到页面。
嗯,恐怕这不是个好主意。我假设这可能是在“内存泄漏问题”(与删除内存中的对象相关的问题以及那些在不同 classes 之间有引用的问题,是什么组成它们,不是吗? t?),只是在不同的 classes(网格、按钮和页面)之间创建引用。
研究解决方案后,似乎可以委托此方法的事件。
但我做不到,这很容易(当你知道的时候)但是示例不是我的案例准备的(或者我找不到)。你能帮个忙吗? :)
我post代码的想法,它是在ListView内部,网格内部的Button上实现的(有点复杂,但我想简化它)。
//This code is called in CarouselPage
// ..............
//ButtonEstadoTarea is type Button
ButtonEstadoTarea bet = new ButtonEstadoTarea();
//OnStartClicked is allocated is this CarouselPage
//
bet.Clicked += this.OnStartClicked;
ListViewIntervencion lvi = new ListViewIntervencion();
lvi.ItemTapped += this.OnItemTapped;
lvi.ItemsSource = intervencion.Interv;
GridCabeceraIntervencion gci = new GridCabeceraIntervencion(intervencion, lvi);
var intervencionContent = new ContentPage
{
Content = gci,
};
this.Children.Add(intervencionContent);
async void OnStartClicked(object sender, EventArgs args)
{
var action = await DisplayActionSheet("Procesar Tarea", null, "Cancel", "Iniciar", "Pausar", "Bloquear", "Terminar");
// MORE MAGIC...
}
谢谢大家。
所有移动平台(ios、android、xamarin)使用弱引用存储(页面、activity、UIViewcontroller)是一个很好的做法。您可以像这样实现对页面的引用:
WeakReference<Page> _pageReference;
public Page Page{
get {
Page _page = null;
_pageReference.TryGetTarget(out _page);
return _page;
}
set{
_pageReference = new WeakReference<Page>(value);
}
}
并且不要忘记在访问页面 属性 时检查是否为 null。这样你就不会有内存泄漏。要了解有关弱引用的更多信息,请阅读: https://msdn.microsoft.com/en-us/library/gg712738(v=vs.110).aspx
我建议使用 MVVM 方法,使用 FreshMvvm,将按钮命令绑定到模型,并使用 CurrentPage 参数
显示操作 sheet