Xamarin中大量使用内存

时间:2017-03-17 07:21:21

标签: c# android xamarin.android xamarin.forms

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

我尝试在我的应用中做一些简单的事情,我发现它很吓人,Xamarin.Forms.BindableProperty+BindablePropertyContext在UWP中占用2.196.088的大小(当然是字节),你可以在跟随screendump。

UWP Managed memory

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

清除GC.Collect()后,我必须致电ListView吗?

1 个答案:

答案 0 :(得分: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;
        }
    }
}

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