chosenOne Thabs
chosenOne Thabs

Reputation: 1640

Xamarin memory leakage

I'm a newbie to Xamarin. I have created an application that uses DrawerLayout(Android). But my problem is that every time i select a item in the menu(DrawerLayout menu), the memory increases, and this causes the app to become slow and crush. I've tried to use Xamarin profiler to analyze memory leaks - it suspects something called String.FastAllocationString, but it doesn't really show the line(code) that causes String.FastAllocationString issue. Please help ? Here is my code :

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();
}

Fragment

  [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

Upvotes: 2

Views: 170

Answers (1)

Shiwanka Chathuranga
Shiwanka Chathuranga

Reputation: 889

you have to check fragment is available before you add new one

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;
}

Hope this help

Upvotes: 3

Related Questions