2013-09-02 1 views
2

내 응용 프로그램 중 하나에서 ListView을 사용할 때 꽤 늦은 지연을 경험했습니다. 같은 시간에 문제가 자체적으로 나타 났으므로 응용 프로그램을 종료 할 때 다음 오류 메시지가 표시되기 시작했습니다. 내 장치가 뿌리되지 않기 때문에Listview lags; 캐시 파일에 문제가 있습니까?

E/libEGL(8501): error creating cache file /data/data/[my application's namespace]/cache/com.android.opengl.shaders_cache: No such file or directory (2) 

, 나는 위치에 액세스 할 수없는 및 파일이 존재 손상 또는 삭제되었는지 확인 할 수있다. 문제가 무엇인지 잘 모르겠습니다. 우선, 문제가 관련 될 수 있습니까? 그것은 이상한 우연한 것처럼 보입니다. 확실하게; 뷰 홀더 패턴을 사용하여 ListView을 최적화하고 구현하기 전에 문제가 없으므로 구현이 어려울 수 있습니다.

업데이트 요청에 따라 여기에 내 어댑터의 getView 코드가 나와 있습니다. 그것이 문제와 관련이 있다고는 생각하지 않지만 약 5 개월 동안 괜찮 았지만 전에는 문제가 없었습니다. 당신은 아마 알고있는대로

@Override 
public View getView(int position, View convertView, ViewGroup parentViewGroup) 
{  
    final PersonaViewHolder viewHolder; 
    final Persona persona = provider[position]; 

    if (convertView == null) 
    { 
     convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_personas, null); 

     viewHolder = new PersonaViewHolder(
       (ImageView) convertView.findViewById(R.id.persona_icon), 
       (TextView) convertView.findViewById(R.id.persona_description)); 
     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (PersonaViewHolder) convertView.getTag(); 
    } 

    Bitmap icon = BitmapFactory.decodeResource(parent.getResources(), persona.getPicture()); 
    viewHolder.setIcon(icon, 50, 50); 
    viewHolder.setDescription(persona.getName() + " is a " + persona.getType() + "!"); 

    return convertView; 
} 
+0

어댑터의'getView()'메소드를 게시 할 수 있습니까? – FoamyGuy

+0

예! 내 질문을 업데이트했습니다. – Eric

답변

2

은, 당신의 getView() 방법에 실제 처리의 모든 유형을 가진 피해야한다. 당신의 getView() 방법에서

Bitmap icon = BitmapFactory.decodeResource(parent.getResources(), persona.getPicture()); 

: 나는 캐시 파일 문제로 말할 수는 없지만, 난 당신이 라인을 알 수 없습니다. 비트 맵을 캐시하려면 LruCache을 구현해야합니다. 그에 대한 문서는 여기에서 찾을 수 있습니다 : http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

또한, 라인

convertView = LayoutInflater.from(parentViewGroup.getContext()).inflate(R.layout.list_personas, null); 

에 당신은 .inflate(R.layout.list_personas, null);를 사용하는 대신 마지막 인수 .inflate(R.layout.list_personas, parent, false);

주에게 차이를 사용할 수 없습니다. 부모에게보기를 첨부하는 적절한 방법입니다. 성능을 향상시킬 수는 없지만 정확합니다.

+0

'Resource','ViewGroup','boolean' 매개 변수를 취하는'inflate'에 대한 대체 서명을 사용하면 java.lang.UnsupportedOperationException : addView (View, LayoutParams)가 지원되지 않습니다. 에서 AdapterView'. 따라서 올바른 것이 아니므로 해당 생성자를 사용하지 않습니다. 올바른 경우 예외가 발생하지 않습니다. 귀하의 첫 번째 제안에 관해서는 캐싱은 이전에 네 가지 항목의 목록에 대해 자동으로 수행되었습니다. 오류에 대한 힌트를 얻었습니다. 이것이 없어지면 수동으로해야 할 수도 있습니다. – Eric

+1

이 문서를 확인하십시오 : http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ – bclymer

+0

매우 유익한 링크 주셔서 감사합니다. 그러나 권장되는 방법을 사용하여 내 코드를 "수정"하면 예외가 발생합니다. – Eric

관련 문제