2017-10-06 13 views
1

My MainActivityにはDrawerがあり、クリックされたMenuItemthis tutorialに基づく)に応じて、新しいFragmentがインスタンス化されます。Android/Java:断片化をインスタンス化するとメモリリークが発生しますか?

私はがわずかにすべてのフラグメントの変化にが増加しているメモリを、監視され、私はfragmentClass.newInstance()は正しい方法ではないことを、心配。

// MainActivity 
public boolean onNavigationItemSelected(MenuItem item) { 

    int id = item.getItemId(); 
    Fragment fragment = null; 
    Class fragmentClass = null; 
    if (id == R.id.nav_camera) { 
     fragmentClass = CameraFragment.class; 
    } else if (id == R.id.nav_gallery) { 
     fragmentClass = GalleryFragment.class; 
    } else if (id == R.id.nav_slideshow) { 
     fragmentClass = SlideshowFragment.class; 
    } else if (id == R.id.nav_manage) { 
     fragmentClass = ManageFragment.class; 
    } else if (id == R.id.nav_share) { 
     fragmentClass = ShareFragment.class; 
    } else if (id == R.id.nav_send) { 
     fragmentClass = SendFragment.class; 
    } 

    try { 
     fragment = (Fragment) fragmentClass.newInstance(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    FragmentManager fragmentManager = getSupportFragmentManager(); 
    fragmentManager.beginTransaction().replace(R.id.layout_main, fragment).commit(); 
} 

私が何か期待する:どのように私は、メモリリークを回避するか、これはさえ関係している可能性があり

// Pseudocode 
if (fragmentManager.instanceExists(fragmentClass)) { 
    // load instantiated fragment 
} else { 
    // newInstance() 
} 

を?

ありがとうございました!

+1

というように、 'fragmentClass = CameraFragment.class'のように書くことができます'fragment = CameraFragment.newInstance()'そのクリーナーはもう少しだし、もうtry catchブロックは必要ありません。 – petey

答えて

1

実際には、このコードに問題はありません。あなたが最適化することができます物事は以下のとおりです。

Fragment#instantiate()方法を再加工
  1. はあなたが

また、引き出し内を移動するたびに新しいものを作成しないようにするためにMapのようなもので

  • キャッシュインスタンスを(docsをご確認ください) FragmentManagerにフラグメントが存在するかどうかは、FragmentManager#findFragmentById()またはFragmentManager#findFragmentByTag()

  • 関連する問題