내 문제는 대부분 strange out of memory issue과 같습니다. recycle()을 호출하여이 문제를 이미 해결했다고 생각합니다. 이 문제는 내 ListView 예제에서 발생합니다. 각 요소 0-10 아이콘이 있습니다. convertView에서 모든 비트 맵을 재활용하도록 어댑터를 확장했습니다. 항목을 클릭 한 후 내 목록과 동일한 BMP를 사용하는 세부 사이트를 표시하고 있습니다. 그러나 Developing은 계속 진행되고 있으며 Tabs에 모든 것을 보여줄 필요가 있습니다. 그래서 내 ListView 및 DetailView 같은 탭에 표시되어야합니다. "ActivityGroup"(btw가 더 이상 사용되지 않음)으로 고생하고 나면 compatibility-package를 사용하고 List 및 DetailActivity를 Fragment로 표시하는 활동을 프로그래밍하기로 결정했습니다. 그것이 작동하는 동안, 내 ListViewAdapter convertView에서 모든 비트 맵을 재활용, 내 DetailView에서 작동하지 않는 것 같습니다. 로그는 재활용이 호출되었음을 알려주지 만 2-3 DetailViews 이후 (표시된 비트 맵에 따라 다름) 동일한 오래된 오류가 발생합니다. 이는 TabView 내부에 살고있는 내 유일한 활동입니다 :조각을 사용하기 때문에 비트 맵 크기가 초과되었습니다.
public class FaultGroup extends FragmentActivity implements OnItemClickListener, OnBackStackChangedListener{
public static final String FRAGMENT_LIST_TAG = "FaultListFragment";
public static final String FRAGMENT_DETAIL_TAG = "FaultDetailFragment";
public static final String TAG = "FaultGroup";
private FragmentManager mFragmentManager;
private FragmentTransaction mTransaction;
private boolean mDetailsShown = false;
public void onCreate(Bundle icicle){
super.onCreate(icicle);
setContentView(R.layout.fragment_layout);
mFragmentManager = getSupportFragmentManager();
mFragmentManager.addOnBackStackChangedListener(this);
FaultReportListFragment fragment = new FaultReportListFragment();
mTransaction= mFragmentManager.beginTransaction();
mTransaction.add(R.id.fragment_container, fragment, FRAGMENT_LIST_TAG);
mTransaction.addToBackStack(null);
mTransaction.commit();
}
public void onResume(){
super.onResume();
LogCat.d(TAG, "onResume");
}
public void onDestroy(){
super.onDestroy();
LogCat.d(TAG, "onDestroy");
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
LogCat.d(TAG, "onItemClick");
DatabaseReport dbReport = (DatabaseReport)parent.getAdapter().getItem(position);
fiScheduleDeviationReport report = dbReport.read();
Bundle arguments = new Bundle();
arguments.putParcelable(FaultReportDetailFragment.KEY_REPORT_EXTRA, report);
FaultReportDetailFragment fragment = new FaultReportDetailFragment();
fragment.setArguments(arguments);
mDetailsShown = true;
mTransaction = mFragmentManager.beginTransaction();
mTransaction.replace(R.id.fragment_container, fragment, FRAGMENT_DETAIL_TAG);
mTransaction.addToBackStack(null);
mTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
mTransaction.commit();
}
@Override
public void onBackPressed(){
mDetailsShown = false;
super.onBackPressed();
/*
mTransaction = mFragmentManager.beginTransaction();
mTransaction.remove(mFragmentManager.findFragmentByTag(FRAGMENT_DETAIL_TAG));
mTransaction.
mTransaction.commit();
*/
}
@Override
public void onBackStackChanged() {
// TODO Auto-generated method stub
}
} 안드로이드 내 DetailFragment에 onDestroyView 및들의 OnDestroy를 호출하지만 어떻게 든 뭔가를 저장하는 나의 로그에 내가 볼
. convertView를 재활용하지 않으면 OOM 오류가 발생합니다. 오류가 발생하지 않습니다. 한 번만 세부 사항을 열면.
세부 사항 : : 여기
내 BMPs에 재활용 방법이다public void onDestroyView(){
LogCat.d(TAG, "onDestroyView");
LinearLayout iconRow;
for (int i = 0; i < mIconInflationArea.getChildCount(); i++){
LogCat.d(TAG, "onDestroyView-> inflationAreaChilds: " + mIconInflationArea.getChildCount());
iconRow = (LinearLayout)mIconInflationArea.getChildAt(i);
for (int row = 0; row < iconRow.getChildCount(); row++){
LogCat.d(TAG, "onDestroyView iconRow childs: " + iconRow.getChildCount());
View v = iconRow.getChildAt(row);
if (v instanceof ImageView){
ImageView image = (ImageView)v;
Drawable d = image.getDrawable();
Bitmap bmp = null;
if (d instanceof SvgDrawable){
SvgDrawable svg = (SvgDrawable)d;
bmp = svg.getBitmap();
} else if (d instanceof BitmapDrawable){
BitmapDrawable bmpd = (BitmapDrawable)d;
bmp = bmpd.getBitmap();
}
if (bmp != null){
bmp.recycle();
}
}
}
iconRow = null;
}
mIconInflationArea.removeAllViews();
mMessage = null;
//System.gc();
super.onDestroyView();
}
어댑터 :
private void recycleBmpsFromConvertView(LinearLayout iconArea){
for (int i = 0; i < iconArea.getChildCount(); i++){
View v = iconArea.getChildAt(i);
if (v instanceof LinearLayout){
LinearLayout row = (LinearLayout)v;
for (int j = 0; j < row.getChildCount(); j++){
View candidate = row.getChildAt(j);
if (candidate instanceof ImageView){
ImageView image = (ImageView)candidate;
Drawable d = image.getDrawable();
Bitmap bmp = null;
if (d instanceof SvgDrawable){
SvgDrawable svg = (SvgDrawable)d;
bmp = svg.getBitmap();
} else if (d instanceof BitmapDrawable){
BitmapDrawable bmpd = (BitmapDrawable)d;
bmp = bmpd.getBitmap();
}
if (bmp != null){
bmp.recycle();
}
}
}
}
}
iconArea.removeAllViews();
}
내가 바로 조각 API에서 그 문제를 해결하기 위해 건가요, 아니면 그냥 내가 놓친 다른 것?
편집 : 나는 메모리 누출이 없다고 생각합니다. Log가 나에게 말하는 내용입니다 :
09-20 17:51:34.578: DEBUG/dalvikvm(11394): GC_EXPLICIT freed 54K, 48% free 4600K/8839K, external 12673K/13427K, paused 93ms
09-20 17:51:54.906: DEBUG/dalvikvm(7904): GC_CONCURRENT freed 608K, 57% free 2902K/6599K, external 1625K/2137K, paused 2ms+7ms
09-20 17:52:00.316: DEBUG/dalvikvm(9634): GC_CONCURRENT freed 550K, 51% free 3242K/6599K, external 1625K/2137K, paused 2ms+7ms
09-20 17:52:12.574: DEBUG/dalvikvm(9634): GC_EXPLICIT freed 352K, 55% free 2998K/6599K, external 1625K/2137K, paused 60ms
09-20 17:52:19.601: DEBUG/dalvikvm(8082): GC_EXPLICIT freed 347K, 53% free 3086K/6535K, external 1625K/2137K, paused 61ms
09-20 17:52:24.609: DEBUG/dalvikvm(7904): GC_EXPLICIT freed 247K, 56% free 2947K/6599K, external 1625K/2137K, paused 64ms
09-20 17:52:53.410: DEBUG/dalvikvm(10578): GC_CONCURRENT freed 540K, 56% free 3007K/6727K, external 1625K/2137K, paused 2ms+9ms
09-20 17:53:05.523: DEBUG/dalvikvm(7904): GC_CONCURRENT freed 591K, 56% free 2952K/6599K, external 1625K/2137K, paused 15ms+2ms
09-20 17:53:35.156: DEBUG/dalvikvm(7904): GC_EXPLICIT freed 259K, 57% free 2895K/6599K, external 1625K/2137K, paused 74ms
09-20 17:53:54.378: DEBUG/dalvikvm(10578): GC_CONCURRENT freed 538K, 56% free 3005K/6727K, external 1625K/2137K, paused 2ms+10ms
09-20 17:54:00.242: DEBUG/dalvikvm(9634): GC_CONCURRENT freed 350K, 52% free 3217K/6599K, external 1625K/2137K, paused 1ms+3ms
09-20 17:54:05.378: DEBUG/dalvikvm(9634): GC_EXPLICIT freed 360K, 55% free 3018K/6599K, external 1625K/2137K, paused 53ms
09-20 17:54:14.785: DEBUG/dalvikvm(8082): GC_EXPLICIT freed 216K, 53% free 3086K/6535K, external 1625K/2137K, paused 58ms
09-20 17:54:16.171: DEBUG/dalvikvm(7904): GC_CONCURRENT freed 574K, 57% free 2899K/6599K, external 1625K/2137K, paused 14ms+2ms
[outofmemoryerror-bitmap-size-exceeds-vm-budget] [1] 확인해보세요. [1] : http://stackoverflow.com/questions/4611822/java-lang-outofmemoryerror-bitmap-size-exceeds-vm-budget – AB1209
하는 것은 나에게 도움이되지 않습니다. 내 주요 질문은 : Fragement-API에서 문제가되는지, Activity로 구현했는지, 아니면 그냥 놓친다는 것입니까 –
그냥 눈치 채지 않았을 수 있습니다. 앱에 메모리 누수가있을 수 있으며이를 발견해야합니다. 내 앱의 logcat 출력을 보면서 많은 성공을 거두었으며 앱에서 일을하면서 GC가 메모리를 회수하는지 확인합니다. 메모리 사용량이 지속적으로 증가한다면 MAT를 사용하여 누출을 발견하는 것이 좋습니다. – hooked82