2013-10-21 3 views
1

ListView에 내 앱이 중단되는 문제가 있습니다. 전체 앱이 충돌하지 않고보기를 닫고 주요 활동을 다시로드합니다. 그것은 겉으로보기에는 잘 작동하고, 꽤 빨리 스크롤하면 대부분 안정적입니다. 그러나 빠른 스크롤을 여러 번 사용하여 위아래로 스크롤하면 화면이 멈추고 주 활동이 다시로드됩니다. 누군가가 문제의 원인을 찾도록 도와 줄 수 있습니까? 를 페치 AsyncTask를 여기매우 빠르게 스크롤 할 때 ListView 크래시가 치명적 오류로 발생합니다.

의 getView() 메소드

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = new ViewHolder(); 
     View vi = convertView; 
     if (convertView == null) { 
      vi = inflater.inflate(R.layout.custom_layout, null); 
      vi.setMinimumHeight(120); 

      holder = new ViewHolder(); 
      holder.text = (TextView) vi.findViewById(R.id.text); 
      holder.icon= (ImageView) vi.findViewById(R.id.icon); 

      vi.setTag(holder); 
     } 

     holder = (ViewHolder) vi.getTag(); 
     holder.position = kanji_ids.get(position); 
     holder.context = vi.getContext(); 
     new DownloadAsyncTask().execute(holder); 
     return vi; 
    } 

된다 : 여기

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 12439 (AsyncTask #4) 

내 코드를 살펴입니다 : 이것은 충돌 때이 로그 캣에서 나타나는 오류입니다 데이터를 표시하고 표시합니다 ...

class DownloadAsyncTask extends AsyncTask<ViewHolder, Void, ViewHolder> { 
    String icon; 
    String text; 

    @Override 
    protected ViewHolder doInBackground(ViewHolder... params) { 
     ViewHolder viewHolder = params[0]; 
     Context context = viewHolder.context; 
     Database db = Database.getInstance(context); 
     text = db.getPercentByPosition(viewHolder.position); 
     icon = db.getIconByPosition(viewHolder.position); 

     return viewHolder; 
    } 

    @Override 
    protected void onPostExecute(ViewHolder result) { 
     if (result.icon == null) { 
      result.icon.setImageResource(R.drawable.loading); 
     } else { 
      result.icon.setImageResource(icon); 
     } 

     result.text.setText(text); 

    } 
} 

답변

0

이는 아이콘이 더 이상 보이지 않기 때문일 수 있습니다. 당신이 스크롤 할 때 그 뷰는 새로운 행을 위해 재사용되었다. WeakReferences을 사용하고 viewHolder 또는 아이콘이 null이 아닌지 확인해야 변경 사항을 무시할 수 있습니다. 텍스트도 마찬가지입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 구현하는 방법에 대해 약간 혼란 스럽다. 소지자의 이미지보기 및 텍스트보기에 약한 참조를 표시합니까? 뷰어 홀더 자체를 약한 참조로 만드나요? – dharris001

관련 문제