私はfragment
7ページを作成するメインを持っています. 私は多くのページを処理するために使用しています。each pages
navigation drawer
gridview
FragmentStatePagerAdapter
gPager.get().setOffscreenPageLimit(gABar.get().getTabCount());
MAT (メモリ分析ツール) を調べると、割り当てられたメモリHeap
内のタブが、ナビゲーション中にサイズDDMS
と同様に増加し続けます (これは向きの変更なしです)。heap
ナビしながら入れてみSystem.gc()
たのですが、ラグが発生するので外します。(弱いおよびソフト)参照、ビューホルダーパターン、および漏れcontext
を処理することにより、コードを既に最適化しました。クリックしcause system gc
ても、割り当てられたメモリは減りません。
以下のコードでOOMが発生する可能性はありますか? つまり、4 つのページで同じフラグメントをインスタンス化したということです。MainGroupFragment
- ドロワー レイアウトを処理し、「グリッドビュー表示」を処理する別のフラグメントも呼び出します。OOM を引き起こさない、またはメモリを節約するようにインスタンス化する効率的な方法はありますか?
@Override public Parcelable saveState() { return null; }
@Override
public void destroyItem(View collection, int position, Object o) {
Log.i("destroyItem", "MyFragmentPagerAdapter destroyItem");
View view = (View)o;
((ViewPager) collection).removeView(view);
view = null;
}
@Override
public Fragment getItem(int arg0) {
SavePref saveState = new SavePref(mContext.get());
switch(arg0){
/** Android tab is selected */
case 0:
//Bundle b = new Bundle();
MainGroupFragment ItemID1 = new MainGroupFragment();
ItemID1.variableAssigned("ItemID", mContext.get());
ItemID1.saveSelecteditem("ItemID",
ItemID1.selectedMainGroup.toString());
//banquet.setRetainInstance(true);
Log.i("#Inside MyFragmentPagerAdapter", "ItemID Value: " +
ItemID1.selectedMainGroup.toString());
//b.putCharSequence("mainGroup", "ItemID");
//banquet.setArguments(b);
return ItemID1;
case 1:
MainGroupFragment ItemID2 = new MainGroupFragment();
ItemID2.variableAssigned("ItemID", mContext.get());
saveState.saveSelecteditem("ItemID",
ItemID2.selectedMainGroup.toString());
//beverages.setRetainInstance(true);
Log.i("#Inside MyFragmentPagerAdapter", "ItemID Value: " +
ItemID2.selectedMainGroup.toString());
return ItemID2;
case 2:
MainGroupFragment ItemID3 = new MainGroupFragment();
ItemID3.variableAssigned("ItemID", mContext.get());
saveState.saveSelecteditem("ItemID",
ItemID3.selectedMainGroup.toString());
//food.setRetainInstance(true);
Log.i("#Inside MyFragmentPagerAdapter", "ItemID Value: " +
ItemID3.selectedMainGroup.toString());
return ItemID3;
case 3:
MainGroupFragment ItemID4 = new MainGroupFragment();
ItemID4.variableAssigned("OTHERS", mContext.get());
saveState.saveSelecteditem("OTHERS",
ItemID4.selectedMainGroup.toString());
//others.setRetainInstance(true);
Log.i("#Inside MyFragmentPagerAdapter", "OTHERS Value: " +
ItemID4.selectedMainGroup.toString());
return ItemID4;
case 4:
HistoryFragment ItemID5 = new HistoryFragment();
return ItemID5;
case 5:
OrdersFragment ItemID6 = new OrdersFragment();
return ItemID6;
case 6:
FavoritesFragment ItemID7 = new FavoritesFragment();
return ItemID7;
default:
//Bundle b2 = new Bundle();
MainGroupFragment ItemID8 = new MainGroupFragment();
ItemID8.variableAssigned("ItemID", mContext.get());
saveState.saveSelecteditem("ItemID",
ItemID8.selectedMainGroup.toString());
return ItemID8;
}
}
MATによると容疑者1のみ。
One instance of "android.support.v4.app.FragmentManagerImpl" loaded by
"dalvik.system.PathClassLoader @ 0x4123f038" occupies 32,500,328 (70.23%) bytes. The memory is
accumulated in one instance of "android.support.v4.app.FragmentManagerImpl" loaded by
"dalvik.system.PathClassLoader @ 0x4123f038".
Keywords
android.support.v4.app.FragmentManagerImpl
dalvik.system.PathClassLoader @ 0x4123f038
これはどういう意味ですか:
The FragmentManager seems to keep every Fragment forever. Make sure you destroy Fragments when you're done with them, simply detaching doesn't remove them from the manager.
アップデート:
これは役に立ちますか?
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}