ListView 비동기식 네트워크 이미지 로드2

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();
		}
	}

총괄: 이렇게 많이 말했는데 나도 이 글을 보는 학우들이 이해할 수 있을지 모르겠다. 이 문제는 여전히 매우 복잡하고 나의 문자 표현 능력은 매우 제한되어 있다.모르는 건 따로 얘기해도 돼요.물론 이 버그는 해결되었습니다. 더 심각한 버그가 하나 더 있습니다. 저희의 취약한 데모를 직접 무너뜨릴 수 있습니다. 믿지 못하겠으면 한번 해 보세요. 예지하고 자세히 설명해 주세요. 다음 블로그를 주목해 주세요.

좋은 웹페이지 즐겨찾기