ListView 비동기식 네트워크 이미지 로드2
지난 문장에서 한 부분을 팔고 두 개의 버그를 남겼다. 동창이 발견했는지 아니면 풀었는지 모르겠다. 그러면 이 문장에서 나는 그 중의 버그를 해결할 것이다(허허 계속 팔아라...)
문제설명: 우리가 목록을 아래로 스크롤하고 위로 스크롤하는 반복적인 조작은 원래iteye의 로고와 니루(죽은 신을 본 학우가 알 것)가 번갈아 보였어야 했는데 비극이 발생하여 그림이 엉망이 되었다.문제가 발생한 원인:listview에서 목록 항목의view가 복용되어 있기 때문에 백엔드에서 그림을 되돌려주고 onPostExecute 방법에서 이 mViewHolder를 호출합니다.mImageView.setImage Bitmap (result) 을 사용할 때, 모든 재사용 item에 영향을 줍니다. 이 때 목록이 굴러갔기 때문에 그림이 정상적으로 보이지 않습니다.문제 해결 방안: 문제가 발생한 원인에 따라 우리는 onPostExecute 방법에서 mViewHolder를 호출하지 않습니다.mImageView.setImageBitmap(result) 방법은 어디에서 사용해야 합니까?여기는 호출되지 않습니다. 그럼 우리 이미지 뷰는 어떻게 그림이 다운로드되었는지 알 수 있습니까?아담터의 notify Data SetChanged () 방법만 호출하면 getView 방법의 호출을 촉발할 수 있고 getView 방법에서는 캐시에 그림을 가져옵니다. (이렇게 하면 화면에서 볼 수 있는 범위의 item은 정상적이고, 보이지 않는 지루한 신마를 보여도 우리는 관심을 두지 않습니다.) 따라서 온포스트 Execute 방법에서는 다운로드한 그림을 캐시에 넣기만 하면 됩니다.그리고 아담터 데이터에 변화가 생겼음을 알립니다.
class ImageLoadTask extends AsyncTask<Object, Void, Bitmap> {
int position;
@Override
protected Bitmap doInBackground(Object... params) {
String url = (String) params[0];
position = (Integer) params[1];
Bitmap drawable = ImageLoader.loadImage(url);//
return drawable;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result == null) {
return;
}
/**
* view , view
*/
//mViewHolder.mImageView.setImageBitmap(result);
cacheImage(position, result);//
/**
* , adapter getView
* getView ,
* setImageBitmap
*/
notifyDataSetChanged();
}
}
총괄: 이렇게 많이 말했는데 나도 이 글을 보는 학우들이 이해할 수 있을지 모르겠다. 이 문제는 여전히 매우 복잡하고 나의 문자 표현 능력은 매우 제한되어 있다.모르는 건 따로 얘기해도 돼요.물론 이 버그는 해결되었습니다. 더 심각한 버그가 하나 더 있습니다. 저희의 취약한 데모를 직접 무너뜨릴 수 있습니다. 믿지 못하겠으면 한번 해 보세요. 예지하고 자세히 설명해 주세요. 다음 블로그를 주목해 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.