我在一些旧的Android设备上运行我的应用程序时遇到了一些问题,因此我下载了Visual Studio Professionel的痕迹,因为它具有Diagnostics Tools

我尝试在我的应用程序中做一些简单的事情,但我发现吓人了,Xamarin.Forms.BindableProperty+BindablePropertyContext在UWP中需要2.196.088的大小(当然以字节为单位),您可以在下面的屏幕转储中看到。

c# - Xamarin中的大量内存使用-LMLPHP

在示例中,我刚刚浏览了5页。在其中两个页面上有ListViews,其中一个页面已被清除3次,并填充了新数据。

那么清除GC.Collect()后是否必须调用ListView吗?

最佳答案

我遇到过类似的问题-多次浏览页面会导致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;
        }
    }
}

您也可以看一下here,但在处理图像时需要小心,如果其父页面位于导航堆栈中并且您想返回,则可能会导致一些问题。

关于c# - Xamarin中的大量内存使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42851517/

10-10 13:07