Xamarin内存泄漏

时间:2017-10-04 21:36:01

标签: xamarin

我是Xamarin的新手。我创建了一个使用DrawerLayout(Android)的应用程序。但我的问题是每次我在菜单中选择一个项目(DrawerLayout菜单)时,内存都会增加,这会导致应用程序变慢和压缩。我曾尝试使用Xamarin分析器来分析内存泄漏 - 它怀疑名为String.FastAllocationString的东西,但它并没有真正显示导致String.FastAllocationString问题的行(代码)。请帮忙 ?这是我的代码:

MainActivity

DrawerLayout drawerLayout;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout);

            // Init toolbar
            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.app_bar);
            SetSupportActionBar(toolbar);
            SupportActionBar.SetTitle(Resource.String.app_name);
            SupportActionBar.SetDisplayHomeAsUpEnabled(true);
            SupportActionBar.SetDisplayShowHomeEnabled(true);

            // Attach item selected handler to navigation view
            var navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
            navigationView.NavigationItemSelected += NavigationView_NavigationItemSelected;

            // Create ActionBarDrawerToggle button and add it to the toolbar
            var drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, Resource.String.open_drawer, Resource.String.close_drawer);
            drawerLayout.SetDrawerListener(drawerToggle);
            drawerToggle.SyncState();
        }

void NavigationView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e)
{
    var ft = FragmentManager.BeginTransaction();
    ft.AddToBackStack(null);

    switch (e.MenuItem.ItemId)
    {
        case (Resource.Id.nav_incidents):
            SupportActionBar.SetTitle(Resource.String.toolbar_Test);
            ft.Add(Resource.Id.HomeFrameLayout, new Test());
            break;
    }

    ft.Commit();

    ft.Dispose();

    // Close drawer
    drawerLayout.CloseDrawers();
}

片段

  [Activity(Label = "Test")]
    public class Test : Fragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            View view = inflater.Inflate(Resource.Layout.Test, container, false);  

       return view;
        }
    }

Xamarin Profiler

enter image description here

1 个答案:

答案 0 :(得分:2)

在添加新的

之前,您必须检查片段是否可用
switch (e.MenuItem.ItemId)
{
   case (Resource.Id.nav_incidents):
        SupportActionBar.SetTitle(Resource.String.toolbar_Test);
        Fragment myFragment = 
        (Fragment)FragmentManager.FindFragmentByTag("FRAGMENT1");
        if (myFragment.IsVisible){
           ft.Replace(Resource.Id.HomeFrameLayout, new Test(),"FRAGMENT1");
        }else{
           ft.Add(Resource.Id.HomeFrameLayout, new Test(),"FRAGMENT1");
        }
        break;
}

希望这个帮助