2011-09-20 2 views
1

내 문제는 대부분 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 
+0

[outofmemoryerror-bitmap-size-exceeds-vm-budget] [1] 확인해보세요. [1] : http://stackoverflow.com/questions/4611822/java-lang-outofmemoryerror-bitmap-size-exceeds-vm-budget – AB1209

+0

하는 것은 나에게 도움이되지 않습니다. 내 주요 질문은 : Fragement-API에서 문제가되는지, Activity로 구현했는지, 아니면 그냥 놓친다는 것입니까 –

+0

그냥 눈치 채지 않았을 수 있습니다. 앱에 메모리 누수가있을 수 있으며이를 발견해야합니다. 내 앱의 logcat 출력을 보면서 많은 성공을 거두었으며 앱에서 일을하면서 GC가 메모리를 회수하는지 확인합니다. 메모리 사용량이 지속적으로 증가한다면 MAT를 사용하여 누출을 발견하는 것이 좋습니다. – hooked82

답변

0

좋아요. Fragments와는 아무런 관련이 없습니다. 내가 사용하는 비트 맵이 너무 큽니다.

+0

안녕하세요. 같은 문제에 직면했습니다. 이 점을 도와주십시오. 웹에서 많은 이미지를 가져오고 현재 이미지 컨셉의 게으른 로딩을 사용합니다. 그것은 OutOfMemoryError를 던졌습니다. 웹 및 재활용 이미지에서 많은 이미지를로드하는 데 사용 된 이미지를 도울 수 있습니까? – TNR

관련 문제