0

각 항목에 ProgressBarImageButton이 포함 된 ListView이 있습니다. 그러나 일부 장치에서는 OutOfMemoryError가 목록 어댑터의 getView() 구현에서 발생합니다. full stacktrace입니다. 오류가 아래에 주어진다 발생진행 표시 줄이있는 getView()의 OutOfMemoryError

줄 다음과 같이 목록 항목에 대한

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 
    if (convertView != null) { 
     holder = (ViewHolder) convertView.getTag(); 
    } else { 
     if (mDrawable == null) 
      mDrawable = mContext.getResources().getDrawable(R.drawable.progress); 

     LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.test_list_item, parent, false); // The crash occurs here. 
     holder = new ViewHolder(convertView); 
     holder.progressBarEpisodes.setProgressDrawable(mDrawable); 
    } 


    // Show season name. 
    refreshProgress(position, holder); 

    ... 

} 


private void refreshProgress(int position, ViewHolder holder) { 
    holder.progressBarEpisodes.setMax(Integer.parseInt(items.get(position).getTotal())); 
    holder.progressBarEpisodes.setProgress(Integer.parseInt(items.get(position).getProgress())); 
} 

내 레이아웃 XML은 다음과 같습니다

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_item_selector" 
    android:paddingLeft="16dp" 
    android:paddingRight="8dp"> 

    <LinearLayout 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="match_parent" 
     android:gravity="center_vertical" 
     android:orientation="vertical" 
     android:paddingTop="12dp" 
     android:paddingBottom="12dp" 
     android:paddingRight="16dp"> 

     .... 

     <ProgressBar 
      android:id="@+id/progressBar" 
      style="?android:attr/progressBarStyleHorizontal" 
      android:layout_width="match_parent" 
      android:layout_height="4dp" 
      android:layout_marginTop="8dp" 
      android:layout_marginBottom="8dp" 
      android:progress="50"/> 


    </LinearLayout> 

    <ImageButton 
     android:id="@+id/imageButton" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     style="@style/EpisodeActionButton" 
     android:focusable="false" 
     android:background="@drawable/list_item_selector_no_alpha" 
     android:progressDrawable="@drawable/progress"/> 

</LinearLayout> 

을 또한,이 같은 진행률 표시 줄 스타일을 정의했습니다 :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item android:id="@android:id/background"> 
     <shape> 
      <solid 
       android:color="@color/gray_500"/> 
     </shape> 
    </item> 

    <item android:id="@android:id/progress"> 
     <clip> 
      <shape> 
       <solid 
        android:color="@color/secondary_500" /> 
      </shape> 
     </clip> 
    </item> 
</layer-list> 

이 충돌 문제의 해결 방법을 도와 줄 수 있습니까? android.graphics.BitmapFactory.decodeStream에서 android.graphics.BitmapFactory.nativeDecodeAsset (BitmapFactory.java)에서 java.lang.OutOfMemoryError와 을 :에 의한

:

+0

어떤 종류의 휴대 전화를 테스트하고 있습니까? listview의 모든 행에서 진행률 표시 줄을 업데이트하면 메모리 측면에서 꽤 부담 스럽습니다. – VicVu

+0

사실, 내 장치에서 충돌을 재현 할 수 없었습니다. 충돌은 HTC One의 Crashlytics와 SYMPHONY W130 (XPLORERW130) –

답변

1

나는 당신의 스택 트레이스의이 부분에 보일 것이다 android.graphics.drawable.Drawable.createFromResourceStream에서 android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:444) 에서 (BitmapFactory.java:609) (Drawable.java:840는)

그것은처럼 나에게 보인다 보기를 확장 할 때마다 표시중인이 비트 맵의 ​​새 버전을 얻으려고합니다. . 내 권장 사항은 프로그래밍 방식으로 해당 비트 맵을 설정하고 여러 비트 맵을 동시에 메모리에로드하지 않도록 동일한 비트 맵을 반복하여 사용하는 것입니다.

얼마나 많은 이들이로드 중입니까? 당신이 사용하여 캐싱 시도해야 여러 다른 이미지를로드하려면 :

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

봅니다 재사용, 캐시 및 자원을 효율적으로 해제합니다.

+0

ThanksNathaniel에 의해보고되었습니다. 나는 그 일을 시도했지만 이상하게 행동한다. 왜냐하면리스트 아이템의 모든 진행 표시 줄에는 동일한 'Drawable'이 있기 때문이다. 모든 진행 막대가 동일한 진행률로 동시에 변경됩니다. 어떤 생각을 어떻게 고쳐야합니까? –

+0

보기 참조 (소지자)를 저장하는 방법 및 진행률 막대를 업데이트하는 방법과 관련하여 더 많은 코드를 게시 할 수 있습니까? –

+0

물론입니다. 질문에있는 코드를 확인하십시오. 나는 그것을 업데이트했다. –