Xamarin中大量使用内存

Las*_*sen 5 c# android xamarin.android xamarin.forms

我在一些旧Android设备上运行我的应用程序时遇到一些问题,因此我下载了一段Visual Studio Professionel,就像它一样Diagnostics Tools.

我尝试在我的应用程序中做一些简单的事情,我觉得它很吓人,Xamarin.Forms.BindableProperty+BindablePropertyContext需要一个2.196.088UWP 的大小(当然是字节),你可以在下面的screendump看到.

UWP托管内存.

在这个例子中,我已经justed浏览了5页.在其中的两个页面上ListViews,其中一个已被清除3次,并填充了新数据.

GC.Collect()清除后我必须打电话ListView吗?

小智 1

我遇到过类似的问题 - 浏览页面几次导致了 OutOfMemoryException。对我来说,解决方案是通过显式 Dispose() 调用来实现页面的自定义渲染。

public class CustomPageRenderer : PageRenderer
{
    private NavigationPage _navigationPage;

    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
    {
        base.OnElementChanged(e);
        _navigationPage = GetNavigationPage(Element);
        SubscribeToPopped(_navigationPage);
    }

    private void SubscribeToPopped(NavigationPage navigationPage)
    {
        if (navigationPage == null)
        {
            return;
        }

        navigationPage.Popped += OnPagePopped;
    }

    protected override void Dispose(bool disposing)
    {
        Log.Info("===========Dispose called===========");
        base.Dispose(disposing);
    }

    private void OnPagePopped(object sender, NavigationEventArgs args)
    {
        if (args.Page != Element)
        {
            return;
        }

        Dispose(true);
        _navigationPage.Popped -= OnPagePopped;
    }

    private static NavigationPage GetNavigationPage(Element element)
    {
        if (element == null)
        {
            return null;
        }

        while (true)
        {
            if (element.Parent == null || element.Parent.GetType() == typeof(NavigationPage))
            {
                return element.Parent as NavigationPage;
            }

            element = element.Parent;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以在这里查看,但是您需要小心处理图像,如果它们的父页面位于导航堆栈中并且您想返回,则可能会导致一些问题。