2016-10-30 8 views
0

私はこのリンクのチュートリアルに従いました:https://github.com/PumpingCode/Xamarin-NavigationDrawerDemoXamarin NavigationDrawer slow

100%動作します。しかし、私が抱えている問題は、アプリケーションが起動後数分間は高速になるということですが、5分間のナビゲーションの後、アプリケーションは遅くなり始めます。引き出しが開くには3秒かかりますが、伸びが遅くなります。スイッチ、スクロールビューなどの他のコントロールにも影響します。非常にゆっくりと反応します。

考えられる原因をご存知ですか?この種の問題をどのように診断できますか?ここで

以下の私のコードです:

MainActivityフラグメントと呼ばれる

public class MainActivity : AppCompatActivity 
    { 
     WebView web_view; 
     MediaPlayer _player; 
     DrawerLayout drawerLayout; 

     protected override void OnCreate(Bundle bundle) 
     { 
      try 
      { 
       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(); 

       //load default home screen 
       var ft = FragmentManager.BeginTransaction(); 
       ft.AddToBackStack(null); 
       ft.Add(Resource.Id.HomeFrameLayout, new Accounts()); 
       ft.Commit(); 

       if (ft != null) 
        ft.Dispose(); 
      } 
      catch (Exception ex) 
      { 
      } 
     } 
    } 

OnSelectItem

async 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_Accounts); 
       ft.Add(Resource.Id.HomeFrameLayout, new Accounts()); 
       break; 
     } 

     ft.Commit(); 

     // Close drawer 
     drawerLayout.CloseDrawers(); 

     if (ft != null) 
      ft.Dispose(); 
    } 

- 選択した項目から

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     // Use this to return your custom view for this Fragment 
     View view = inflater.Inflate(Resource.Layout.Accounts, container, false); //specify the page you want to redirect to 
     SQLiteDatabase db = null; 
     MemberDetails objMember = null; 

     try 
     { 
      TextView tvAccountStatus = view.FindViewById<TextView>(Resource.Id.lblAccountStatus); 
      TextView tvDateJoined = view.FindViewById<TextView>(Resource.Id.lblDateJoined); 
      TextView tvAccountNo = view.FindViewById<TextView>(Resource.Id.lblAccountNumber); 

      objMember = LocalDB.GetProfileInfo(); 

      tvDateJoined.Text = Convert.ToDateTime(objMember.AccountDateJoined).ToString("dd MMM yyyy"); 
      tvAccountNo.Text = objMember.ImeiNo; 
     } 
     catch (Exception ex) 
     { 
     } 
     finally 
     { 
      Utilities.Dispose(db); 
      Utilities.Dispose(objMember); 
     } 

     return view; 
    } 

答えて

0

これは、ネイティブビューが漏洩することによって発生する可能性があります。新しいビューを作成し、イベントなどに+ =付きで添付した各フラグメント/ビュー/コントロールは、解放するまでメモリに残ります。

OnCreateで作成した各コントロールをOnDestroyのイベントから破棄して削除するようにしてください。

だからあなたのコードは次のようにする必要があります:私はまださえコントロールやビューを配置した後、低速航行を経験してい

protected override void OnCreate (Bundle bundle) 
    { 
     base.OnCreate (bundle); 
     using (var layoutInflater = LayoutInflater.From (this)) 
     { 
      _FilterItemList = layoutInflater.Inflate (Resource.Layout.ActionBarHeaderCentered, null); 
     } 

     _PageTitle = FindViewById<TextView> (Resource.Id.textPageHeader); 
     _PageTitle.Text = Resources.GetString (Resource.String.about_title); 

     // .. 
    } 

    protected override void OnDestroy() 
    { 
     // ... 
     if (_PageTitle != null) 
     { 
      _PageTitle.Dispose(); 
      _PageTitle = null; 
     } 
     .. 
    } 
+0

。私は、Androidアプリのメモリリークを監視するツールを試してみます。 –